Q1:请问a=?可以正常打印ok
var a=?
if(a==1&&a==2&&a==3){
console.log("ok")
}
答案:
var a={
i:0;
toString(){
return ++this.i
}
}
解答2:
var i=0
Object.defineProperty(window,"a",{
get(){
return ++i
}
})
Q2
var x=1;
function func(x,y=amouse(){x=2}){
x=3
y()
console.log(x)
}
func(5)
console.log(x)
答案: x=2, x=1 (从上到下)
var x=1;
function func(x,y=amouse(){x=2}){
var x=3
y()
console.log(x)
}
func(5)
console.log(x)
答案 3 ,1
Q4:如何实现一个函数,形如fn(1,2)(3),该函数执行以后得到的结果是6?
本质:参数求和
解法1:
let fn=function fn(...outArgs){
return function (...innerArgs){
return outArgs.concat(innerArgs).reducer((a,b)=>a+b)
}
}
解法2: (es6写法:)
let fn=(...outArgs)=>(...innerArgs)=>outArgs.concat(innerArgs).reducer((a,b)=>a+b)
let fn=(...outArgs)=>(...innerArgs)=>[...outArgs,...innerArgs].reducer((a,b)=>a+b)
Q5:
var x=10
~ function (x){
console.log(x)
x=x||20&&30||40
console.log(x)
}()
console.log(x)
请确认输入结果?
答案解析:
自执行函数执行时因为没有实参,所有第一个 console.log(x),此时x为undefined,当代码执行到
x=x||20&&30||40,因为优先级关系。会先执行20&30,得到的结果是30,继而变成x=x||30||40,
又由于x为undefined,所以成了x=undefined||30||40,第一个比较undefined||30,结果为30,所以代码成了x=30||40,===》而30||40的结果是30.所以最后x=30
所以匿名函数执行的结果是30.而最后一个console.log(x)。此时的x是全局作用域下的x,所以直接输出10
Q6: 请写出以下判断的结果:
console.log({}==false)
console.log([]==false)
console.log(![]==false)
答案解析:
(1)console.log({}==false)
内部执行顺序:由于是不同数据类型,所以==两边都需要转化为数字再进行比较。转化为数字,内部使用的是Number方法,{}转为数字是NaN,而false转为数字是0.所以他们并不相等。console.log({}==false)的结果是false
(2)console.log([]==false)
同理,由于[]和false类型不同。在进行==比较的时候都要进行转为数字再比较的步骤,[]转化为数字是0,而false转化为数字是0,所以console.log([]==false)的结果是true
(3)console.log(![]==false)
在运算符优先级中,!的优先级要高于==,所以这个过程是先进行![]的转化,再进行==的比较
在进行布尔值的转换中。除了"",undefined,null,0和NaN被转化为false以外,其他的都被转化为true,所以![]==false)的过程是 先![]转为了!true==>false,最后是false==false,等式成立,所以最后的结果是true
-------------------------------------------------------------------------------------------------------------
==隐式类型转换规则
类型相同:
{}=={} ---false 比较的是堆内存的地址
[]==[] ----false 比较的说是堆内存的地址
NaN==NaN ---false NaN和任何其他类型比价都不相等
类型不同:
1 null==undefined ----true 但是换成===结果是false,因为类型不一样,剩下的
null/undefined和其他任何类型比较都不相等
2 字符串vs 对象 :要把对象转化为字符串
3 剩下如果==两边数据类型不一致,都要转化为数字进行比较
----------------------------------------------------------------------------------------------------------
其他类型转为布尔值的规则:
! 转化为false,
!! 转化为true
除了 0 ,"",undefined,null,NaN转为false以外,其他的都将被转化为true