Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Typescript不鼓励将值设置为null?_Javascript_Typescript_Nullable - Fatal编程技术网

Javascript 为什么Typescript不鼓励将值设置为null?

Javascript 为什么Typescript不鼓励将值设置为null?,javascript,typescript,nullable,Javascript,Typescript,Nullable,我不理解不可空类型和Typescript的strictNullChecks标志背后的原因。我总是将变量的值设置为null,当我确信我已经完成了从内存中释放它的操作,并且GC可以收集它时。我的测试表明,它将JavaScript代码的执行速度提高了很多倍,特别是在长循环和深循环中。这种做法不好吗?是否应该将某些类型的变量设置为null而不是其他类型的?原因是为了防止一些运行时错误,包括console.log(null.printwynullisbad())在编译时捕获这些错误,同时假设编写循环如此深

我不理解不可空类型和Typescript的
strictNullChecks
标志背后的原因。我总是将变量的值设置为null,当我确信我已经完成了从内存中释放它的操作,并且GC可以收集它时。我的测试表明,它将JavaScript代码的执行速度提高了很多倍,特别是在长循环和深循环中。这种做法不好吗?是否应该将某些类型的变量设置为null而不是其他类型的?

原因是为了防止一些运行时错误,包括
console.log(null.printwynullisbad())在编译时捕获这些错误,同时假设编写循环如此深入和嵌套,从而将现代JS垃圾收集器扩展到极限的人可以用C/C++编写此类代码并使用WebAssembly运行。

在大多数情况下,您不必自己删除变量值。这可能是一个设计缺陷。 还请注意,如果要删除对象特性值,则使用以下选项可能更为一致:

删除myObject.attr;//设置“未定义”
我不理解不可空类型和Typescript的strictNullChecks标志背后的原因

要了解背后的逻辑,请检查此示例:

//strictNullChecks:false
界面样本{
颜色:字符串;
宽度:数字;
}
功能剂量测定(样本:样本):样本{
如果(样本宽度>10){
返回null;
}
返回样品;
}
常数优先:样本={
颜色:“红色”,
宽度:15
};
常数秒:样本=剂量测定(第一);
console.log(秒宽度);//未捕获的TypeError:无法读取null的属性“宽度”

此代码仅编译时不带
stricnullchecks
标志。在这种情况下,当代码运行时,我们有一个漂亮的错误:
uncaughttypeerror:cannotreadproperty'width'为null

检查功能
doSomething
。它返回一个
Sample
类型,但是如果没有该标志,我们可以返回
null
。这里的问题是,当我们调用此函数时,返回的值将作为
示例进行操作。
=>类型与其实际值类型之间存在不一致。这是错误的一大原因


我喜欢认为TS类型必须反映最佳的实际值类型。

出于好奇,你能分享一下你所说的测试吗?我提到的测试基本上是在旧款智能手机上运行一些代码,然后用内存不足的代码将其崩溃,然后调整代码,直到它再次运行。因此,该代码在桌面浏览器(Firefox)中的运行速度也提高了约4倍,可能是因为避免了GC。代码将数MB的CSV文本解析为JSON,并将其存储在数据库中。如果只使用
null
来释放内存(嘿,你是老板),在这里显示我的建议相当复杂:打开
--strictNullChecks
,将变量声明为不可空(例如,
让x:string=“hello”
然后,如果必须在处理完某个变量后将其设置为
null
,请向编译器撒谎(例如,
x=null!;
其中
运算符是非null断言);如果你真的不再使用它,就足够安全了。如果它满足你的需要,很高兴能将它变成一个答案。祝你好运!谢谢@jcalz
x=null!;
通过简单的查找和替换修复了我的所有错误,同时仍然允许使用
stricnullchecks
标志。它可能不能回答整个问题,但它是一个超级错误提示!我理解您的回答是为了显示TS出现意外错误的可能性。除非您将其更改为:
function doSomething(sample:sample):sample | null,否则代码将无法编译{
表示您对函数返回
null
@deceze Right感到满意!我编辑了我的帖子,它只对对象属性有效。@winwiz1是的,此代码只编译,没有
stricnullchecks
标志。这是为了回答作者的第一个问题,“为什么要使用此标志?”。可能是新手开发人员的设计缺陷:)然而,在这种情况下,将值设置为null似乎确实解决了我在GC中的问题。也许我需要告诉Typescript我打算这样做,这样它就不会抛出所有这些错误,或者干脆关闭flagsThank,所以基本上我要咬的东西比JavaScript要多。我不是一个C/C++开发人员,但我认为在那些有错误的语言中如果没有GC,那么不管怎么说,你都会将未使用的值设置为null,不过如果我知道这些语言,可能会是一种更好的方法。我知道在JS中,将变量设置为null(这是对象的句柄,而对象又是指向GC内存的不透明指针)实际上并没有释放内存。它为GC提供了一个提示,否则GC可能会在随后的垃圾收集循环中收集内存。不,这不是C/C++中的工作方式。对于基于堆栈的对象,您不做任何事情,因为函数返回时堆栈会被重用/覆盖。对于基于堆的对象,您必须显式地分配使用内存,然后必须显式地释放它,除非使用C++帮助器帮助解除分配。