计算以下代码的输出。
var result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
console.log(result)
答案:“NaNTencentnull9false”
知识点:
① 其他数据类型转换为number类型的规则(boolean,null,undefined)
② 其他数据类型转换为string类型的规则([]等)
③ 字符串拼接的适用场景
============================================
2.
console.log([] == false);
console.log(![] == false);
答案:true, false
知识点:
① == 比较时的转换规则,见下方总结
② 运算符优先级问题,! 优先级高于 ==
一点补充:== 比较时的转换规则
- 对象 == 字符串时:对象====>字符串
- null == undefined为true(===时为false),除此之外,两者均与其他任何值不相等。
- NaN与任何值都不 ==
- 其他情况下,均转换为number类型再比较(隐式转换,通过Number方法)
============================================
3.
{} + 0 ? alert("ok") : alert("no");
0 + {} ? alert("ok") : alert("no");
答案:“no”, “ok”
知识点:
① 三元运算符
② 转换为boolean类型
③ {}的双重身份
又一些补充
{}的作用: 对象; 代码块
- 简单的情况:当{}放在运算符后面时,如
0 + {}
,则一定是数学运算。
{}在转换为number类型的过程中,首先转换为string类型"[object Object]",立即完成字符串拼接。
- 复杂的情况:{}出现在运算符前面时,浏览器认为它表示代码块,是单独存在的,不参与后面的计算,因此:
但也可通过加()的方式,强行将它们绑在一起,使得浏览器认为它们是一个整体,这样就会参与后面的运算。
============================================
4.
let res = Number("12px");
if(res === 12){
alert(200);
}else if(res === NaN){
alert(NaN);
}else if(typeof res === "number"){
alert("number");
}else{
alert("Invalid Number");
}
答案:“number”
知识点:
① Number()方法的转换机制
② NaN ! == NaN
③ typeof NaN === “number”
============================================
5.
var a = {}, b = "0", c = 0;
a[b] = "你好";
a[c] = "再见";
console.log(a[b]);
var a = {}, b = Symbol("1"), c = Symbol("1");
a[b] = "你好";
a[c] = "再见";
console.log(a[b]);
var a = {}, b = {n: "1"}, c = {m: "2"};
a[b] = "你好";
a[c] = "再见";
console.log(a[b]);
答案:“再见”, “你好”, “再见”
知识点:
① 对象的属性名为对象时的转换
② Symbol() 唯一值
============================================
6.
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x);
console.log(b.x);
答案:undefined, {n: 2}
知识点:
① 堆栈内存
② 连等
============================================
7.
var x = [12,23];
function fn(y){
y[0] = 100;
y = [100];
y[1] = 200;
console.log(y);
}
fn(x);
console.log(x);
答案:[100,200], [100,23]
知识点:
① 函数创建与执行时的堆栈内存机制
② 变量提升也需要考虑在内
详解见函数的创建和执行过程
============================================
8.
let arr = [1,2,3,4];
arr = arr.map(parseInt);
console.log(arr);
答案: [1,NaN,NaN,NaN]
知识点:
① 数组迭代方法map,[数组的迭代方法总结-链接占位处]
② parseInt的第二个参数,你不知道的parseInt