之一
var a = false + 1;
console.log(a)// 1
// false会通过隐式转换成 0
// 知识点隐式类型转换 true 隐式类型转换为 1 false隐式类型转换为 0
var a = '1' + false;
console.log(a)// '1false'
var b = false == 1
console.log(b) // false
// 比较运算输出bool类型
if(typeof(a) && (-true) + (+undefined) + '') {
console.log('通过了')
}else {
console.log('未通过')
}
// 通过了
// 解析:a是undefined,正常是会报错,因为a未定义,但是typeof包裹会将其变成字符串‘undefined’
// 因此返回真 &&运算符 如果遇到真就会继续向下寻找直到遇到假返回当前值 ||运算符相反
// -true会通过隐式转换成-1,+undefined会转换成NaN,NaN同任何一个数字相加都是NaN包括他自己,
// NaN + '' 会转变成字符串‘NaN'(字符串与任何相加都是字符串)
if(1 + 5 * '3' === 16) {
console.log('通过了')
}else {
console.log('未通过')
}
// 通过了
// 5*'3'会将’3‘隐式转换成数字类型
console.log(!!' ' + !!'' + !!false || '未通过了')
// 1
// 解析: 知识点在于能转换成false的几种方式,undefined, null, NaN, 0, -0, ''。除去这些都为true
// !!' '===>true, !!''===>false !!false ===> false, 1+0+0 == 1
// 1 || '通过了' ||运算符遇到假就会往下走,遇到真就返回当前所以是1
window.a || (window.a = '3')
console.log(window.a)
// 3
// 解析:优先级问题, 如果说因为 window.a = undefined 为假 继续往下走 返回3就错了
// 括号优先级最高 window.a = ’3‘为真然后回来走||运算,这个时候window.a为真 返回
之二
var fn = (
function test1() {
return 1;
},
function test2() {
return '2';
}
)()
console.log(typeof(fn))
// string
// 解析:逗号是个运算符 只返回后面的那个,因此返回test2()
var a = 10;
if(function b() {}) {
a+=typeof(b)
}
console.log(a)
//'10undrfined'
// 前面说过除去那六种都为true,因此判断语句会执行。(function b(){}) 有括号会变成表达式,会忽略函数名,
// 因此没有b,b未被定义一般会报错,但是加上typeof就会变成字符串’undefined‘
// a+='undefined' ==> a = a + 'undefined' =>'10undefined'
之三
var name = 'zhangsan'
name += 10;//'zhangsan10'
var type = typeof(name) // string
if(type.length === 6) {// true
type.text = 'string' // new String(type).text = 'string'
// delete
}
console.log(type.text)
// undefined
// 解析: 考察点包装类,基础类型调用方法时, 一般逻辑上来说是不可能的,但是后台自动完成了一系列处理
// 1. 创建String类型的一个实例
// 2. 在实例上添加方法
// 3. 销毁这个实例
// 经过处理基本的字符串值就会变得和对象一样了, 同理适用于Boolean, Number.
// 引用类型和基本包装类型区别在于,引用类型在执行流在离开当前作用域之前,会一直存在内存中, 而自动创建的基本包装类型的对象则只存在于代码执行的那一瞬间,然后立即被销毁。这意味着我们不能在运行时为基本包装类型添加属性和方法
// 在type.text = 'string' 时有text属性,然后立即销毁,最后一行代码又创建自己的String对象,而该对象没有text属性
// 红宝书 118-119
function Car(brand, color) {
this.brand = 'Benz';
this.color = 'red';
}
var car = new Car('Mazda', 'blank')
console.log(car)
// 参数没有赋值 ,打印原始值
function Test(a, b, c) {
var d = 1;
this.a = a;
this.b = b;
this.c = c;
function f() {
d++
console.log(d)
}
this.g = f
}
var test1 = new Test()
test1.g()// 2
test1.g()// 3
var test2 = new Test()
test1.g()//2
var x = 1,
y = z = 0;
function add(n) {
return n = n + 1;
}
y = add(x) // x = 1 y = 4
function add(n) {
return n = n + 3;
}
z = add(x) // x = 1 z = 4
console,log(x, y, z)
// 解析:
/*
GO = {
a: 1,
y: 0,
z: 0,
add:function(n) {return n = n + 1} => function(n) {return n = n + 3} 同名函数覆盖掉
}
y = add(x) ==> 4
z = add(x) ==> 4
*/