发表于: 2018-04-28 23:12:54
1 416
今天完成的事情:
1、学习js作用域及执行环境。
2、学习js数据类型。
3、学习gulp的两个插件gulp-plumber|gulp-sourcemaps
明天计划的事情:
1、搞好小课堂。
2、学习css.
遇到的问题:
1、关于一个简单的面试题?
这里color最后得到值是什么?
是red还是green.
答案是green。why?
重点就在[] ==![] 这个比较表达式返回true?
!这个值的操作,在高程44页上很清楚,!操作数是对象的时候,返回的是false
[]==false ,==内部调用的是Number(),false转化为0,而对对象,首先调用其valueOf()方法,如果返回值不是基本值,那么就调用对象的toString()方法。所有[]转化为0 ,0 ==0 返回true。
最后就是 逻辑与(&&)的操作。
true && true,逻辑与操作符,如果第一个值是true ,直接返回第二个值。所以if条件语句成立,然后color赋值为green。
这个时候打印出green。
再来看一个有趣的例子:
这里的两个表达式都是返回true,背后的原理就是!的表现。遇到对象就会返回false。
==比较就很简单了
收获:
1、了解基本类型和引用类型的值。
基本类型是:null,number,string,boolean,undefind
引用类型是:object(包括数组和函数)
es6新增基本类型:symbol.
我创建了一个person对象,并为其添加的一个name的属性(这个操作是操作实际的对象)。
我又创建了一个name变量,里面放了一个字符串值,为这个基本类型添加一个属性,发现结果是undefined,这说明只能给引用类型动态的添加属性。
看下复制变量:
对于基本类型的值,会在栈内存中重新分配位置,简而言之,复制基本类型的值,复制后,两个变量不会影响彼此,就像上面一样,num2值改变后,并不会影响num。
复制引用类型的值:
创建person1变量并把person的变量复制给它,为person1对象新增一个age属性,发现这个属性也会显示在person对象上。
结论:引用类型的复制,只是复制引用类型的地址,即在栈内存中添加一个变量,这个变量指向堆内存中的引用类型(对象),也就是说person复制的是指向对象的指针,而不是对象本身。
这是person和person1都指向这个对象,所以操作person1也会反应到person上来。
访问值有按值访问和按引用地址访问,而函数传参的话,只能按值传递。
我调用add函数,传入了基本类型的值20,然后再函数内部,让局部变量value复制num 的值,然后加10 ,返回该值。
这是num的值是20,函数调用后的返回值是30说明,基本类型的值是按值传递的,如果按引用传递的话,那么num应该变成30才对。
但是num没变,说明基本类型的值是按值传递的。
这里有个对象,传入对象,传入的是对象的值,而不是引用地址。
这里函数内部的obj复制这个person对象,其实就是复制这个对象的指针,也就是说这个局部变量也是指向堆内存里面的对象,
所以obj.age=20,也会反应到person身上(操作的是对象本事)
假如说是传入的引用地址,也就是说obj的地址和person的地址一样,此时改变person的引用地址,那么外边的obj的指向也会改变,因为传入的地址。
但是没有改变说明引用的是值,后来局部变量指针指向一个新的局部对象,这个局部对象在函数完成后就会销毁。
评论