1. 不能为基本类型变量添加属性和方法. 如果添加了,那么也是undefined的.
1 var str = "a string"; 2 str.attr = "attr"; 3 console.log(str); // "a string" 4 console.log(str.attr); // undefined
2. 声明了但未赋值的变量和未声明的变量都不能直接用, 但是错误是不一样的. 和它们在堆区和栈区的存储有关系.
1 var t; 2 console.log(t); // undefined 3 console.log(s); // ReferenceError:s is not defined
3. 定义变量要使用var关键字, 但是没有使用var也可以赋值给一个变量名, 如: s = 10; 但是此时s不管是在局部域还是全局域里, 这个变量始终都属于 window 对象.
4. JavaScript中的变量作用域在函数体内有效,无块作用域.
1 var f = function(){ 2 for(var i=0;i<n;++i){ 3 console.log(i); 4 } 5 //在这里i仍然有效,作用域范围是function的. 6 }
5. 一段代码说明HTML文档流中不同代码执行先后顺序
1 <script type="text/javascript"> 2 console.log("first"); 3 function fn(){ 4 console.log("third"); 5 } 6 </script> 7 <body onload="fn()"> 8 <script type="text/javascript"> 9 console.log("second"); 10 </script> 11 </body>
- onload()事件是最后执行的.
6. JavaScript基本类型用作包装对象时其属性都是只读的,并且不能给它们定义新的属性, 它们是有别于对象的; 不过可以通过String(),Number()或者Boolean()构造函数显示创建包装对象.
- 使用包装对象.
1 var s = "test"; 2 s.len = 4; 3 var t = s.len; 4 console.log(s); 5 console.log(t); 6 /*output: 7 test 8 undefined 9 */
- 使用构造函数
1 var s = "test",n = 1,b = true; 2 var str = new String(s); 3 var num = new Number(n); 4 var bool = new Boolean(b); 5 str.len = "test".length; 6 var t = str.len; 7 console.log(str); 8 console.log(t); 9 /*output: 10 { [String: 'test'] len: 4 } 11 4 12 */
7. null和undefined比较
undefined可以理解为一块荒地,里面有杂草,石头和各种垃圾, 不能直接耕种, 而null就相当于除草,捡出石头和垃圾, 让这块荒地变得可以耕种, 本质上来说是内存的两种不同的状态.
- typeof(null); //"object" 特殊的对象, 含义是"非对象"(或指向空对象), 也可以表示基本类型的变量是无值的, 但是如果将它赋给基本类型变量, 则变量也类型转换成了object类型了.
- typeof(undefined); //"undefined" 预定义的全局变量,undefined在ECMAScript3中是W/R的, 在ECMAScript5中的Read-only的.
- 是变量的一种取值, 表明变量没有初始化.
- 如果查询对象属性或者数组元素的值时返回undefined, 则说明这个属性或元素不存在(如果要删除某对象的某个属性, 直接赋为undefined即可.).
- 如果函数没有返回任何值, 则返回undefined.
- 引用没有提供实参的函数形参的值也只会得到undefined.
- 比较:
- null 和 undefined本质是不同的, 但是往往可以互换,(1) null == undefined, null !== undefined; (2) 希望是布尔类型的地方它们都是false, null和undefined都不包含任何属性和方法; (3) 如果想赋给变量或者属性, 或者将它们作为参数传入函数, 最好用null.
8. 数组和函数在js里面是对象, 而且函数是一等对象(first class).
9. 对象的比较.(以下比较结果全为false)
1 var a = [1,2,3,4]; 2 var b = [1,2,3,4]; 3 console.log(a==b); 4 console.log(a===b);//两个单独的数组永不相等 5 var c = {x:1}; 6 var d = {x:1}; 7 console.log(c==d); 8 console.log(c===d);//两个单独的对象永不相等
- 不等是因为对象是保存的引用.
- === 恒等运算
- true = (值类型相同) && (都不是null或者undefined或者NaN) && (值相同) else false
1 var a = NaN; 2 var b = NaN; 3 console.log(a===b);//换成null 和 undefined时恒等. 4 /*false*/
- == 在比较前会先进行类型转换, 转换原则与C语言转换很相似, 对象的转换先尝试用valueOf(),再尝试用toString()转换为原始值再进行比较(日期类只使用toString()转换). 不是JavaScript语言核心中的对象则通过各自的实现中定义的方法转换为原始值.
10. JavaScript的类型转换.
- 非常灵活, 主要还是根据上下文, 比如一个数字算术运算一个字符串, 会尝试将字符串转换成数字(注意: "4a"=>NaN). 如果是一个NaN+"string", 那么就会变成 "NaN string".
1 var a = 4 * "4a";//NaN 2 a = NaN + "4 string";//"NaN4 string" 3 a = 4 + "4"; //"44" 4 a = 4*"4"; //16