javascript - 在an语句中,javascript为什么使用双引号?

  显示原文与译文双语对照的内容
149 2

我最近阅读了一些使用 将变量转换为boolean的代码,以便在if语句中进行计算。!这对我来说似乎有点冗余,因为变量会被评估为它的布尔值。这样做有什么好处或者是为了更好的浏览器支持?

代码示例:

var x = 0;
var atTop = x===window.scrollY;
if(!!atTop){
 alert("At the top of the page.");
}

编辑:

我也看到了这些操作数不是布尔类型,但是我一直假设使用 if的布尔值是"truthy"或者"falsey"。

代码示例:

var x = 1;//or any other value including null, undefined, some string, etc
if(!!x){//x is"truthy"
//wouldn't using if(x) be the same???
 console.log("something...");
}
时间:原作者:0个回答

90 1

简短回答: 不,没有理由。

在代码中,它已经经是一个 boolean 类型,不需要转换它,再次转换,你将总是得到相同的结果。实际上,如果有任何布尔( true 或者 false ),当使用 时,它将被转换为它的初始值:!

console.log(!!true);//Will be always"true"
console.log(typeof!!true);//It stills a"boolean" type
console.log(!!false);//Will be always"false"
console.log(typeof!!false);//It stills a"boolean" type

编辑问题的答案:是的,这是一样的。这就是 if(...) 实际上做的- 它试图将任何类型转换为 boolean

下面是一个小测试,可以以使用 inside initialArr array 进行测试,它的行为与 if 和 的行为相同:!

const initialArr = [
 undefined,
 null,
 true,
 false,
 0,
 3,
 -1,
 +Infinity,
 -Infinity,
 Infinity,
 'any',
 '',
 function() { return 1 },
 {},
 { prop: 1 },
 [],
 [0],
 [0, 1]
];
function testIsTheSame(arr) {
 equolityCounter = 0;
 arr.forEach(item => {
 let ifStatement = false;
 let doubleNotStatement =!!item;
 if(item) {
 ifStatement = true;
 }
 if(ifStatement === doubleNotStatement && typeof ifStatement === typeof doubleNotStatement) {
 equolityCounter++;
 }
 });
 console.log(`Is the same: ${equolityCounter === arr.length}`);
}
testIsTheSame(initialArr);
原作者:
...