第二章 基础
通常认为在JavaScript中主要包括五种基本数据类型:
数字、字符串、布尔值、undefined、null。
任何不属于上述五种基本类型的值都被认为是一个对象。
null和undefined:通常认为null是它自有类型Null的唯一一个成员,undefined是预定义的全局变量(与null不同,它不是关键字),只读,它也是这个类型的唯一成员,如果试图访问某个不存在的或者未经赋值的变量时,就会得到一个undefined值。
有时候执行某种算术运算时,null和undefined的结果会截然不同。
另:typeof (null) 返回 object,被公认为是历史遗留错误。
关于NULL:
以前只知道在C/C++中代表指针指向空的含义,发现在JS中居然是一种primitive type,有点吃惊,再一搜,发现在Java中也提到这是一种类型,只不过没有name,以前
没有注意到。
在C/C++中只是一个简单的宏定义,注意C++11倡导用 nullptr 代替NULL。
而在Java和JS中,我觉得还是直接看文档吧,把文档贴在这里(虽然文档的描述读起来很别扭):
其实 Java和 JS中的 null 本质上还是代表空指针而已,只不过在高级语言中封装一下,甚至把它单独作为一个类型列出来。
绝大部分值在转换为布尔类型时都为true,但以下6种falsy值除外:
"" null undefined 0 NaN false
一点联想:Java和C++中都有引用的概念,当然它们本质上都是指针,但是侧重点不太一样,C++中的是Type* const型的指针,侧重“引用即别名”,而 Java 中
侧重“对象的引用”(数组可看成一种特殊的对象),Java中的引用更类似于C++中的指针,尤其它们都与 new 连用。实际上,我好像记得轮子哥说过,引用其实就是
C++中的语法糖。
所以可以说Java中的指针(引用)只能指向对象,而不是像C++中可以指向primitive type,JS中自然也是如此。所以在上面的JS文档中:
The value
null
represents the intentional absence of any object value.
此外,像传值或者传引用这类老掉牙的问题我早就懂了,另:一切传引用本质上也是传值。
又一点联想:C++中的NULL和Java中的null有何区别?参考:Stackoverflow。
Note:
(1)NaN == NaN false
(2)惰性求值:true || "some" true;
true && "some" "some";
typeof会返回一个代表数据类型的字符串,它的值包括:"number","string","boolean","undefined","object"和"function"。
第三章 函数
函数也是数据。
匿名函数,回调函数,自调函数,内部函数,返回函数的函数,能重写自己的函数。
1 例子: 2 var a = function() { 3 function someSetup(){ 4 var setup = 'done'; 5 } 6 function actualwork(){ 7 alert('Worky-worky'); 8 } 9 someSetup(); 10 return actualwork; 11 }();
闭包:
1 function f(){ 2 var b = "b"; 3 return function(){ 4 return b; 5 } 6 } 7 8 var n = f(); n(); 9 10 var n; 11 function f(){ 12 var b = 'b'; 13 n = function(){ 14 return b; 15 } 16 } 17 18 function f(arg){ 19 var n = function(){ 20 return arg; 21 } 22 arg++; 23 return n; 24 } 25 26 var m = f(123); 27 m();
循环中的闭包:
1 function f(){ 2 var a = []; 3 for(var i = 0;i < 3;i++){ 4 a[i] = function(){ 5 return i; 6 } 7 } 8 return a; 9 } 10 11 var m = f(); 12 m[0](); 13 m[1](); 14 m[2](); 15 16 function f(){ 17 var a = []; 18 for (var i = 0; i < 3; i++) { 19 a[i] = (function(x){ 20 return function(){ 21 return x; 22 } 23 })(i); 24 } 25 return a; 26 } 27 28 function f(){ 29 var a = []; 30 for(var i = 0; i < 3; i++){ 31 (function(arg){ 32 a[i] = function(){ 33 return arg; 34 } 35 })(i); 36 } 37 } 38 39 fucntion f(){ 40 function makeClosure(x){ 41 return function(){ 42 return x; 43 } 44 } 45 var a = []; 46 for(var i = 0; i < 3; i++){ 47 a[i] = makeClosure(i); 48 } 49 return a; 50 }
Getter和Setter:
1 var getValue, setValue; 2 (function(){ 3 var serect = 0; 4 getValue = function(){ 5 return serect; 6 }; 7 setValue = function(v){ 8 serect = v; 9 }; 10 })()
迭代器:
1 function setup(x){ 2 var i = 0; 3 return function(){ 4 return x[i++]; 5 } 6 } 7 var next = setup(['a', 'b', 'c']);
第四章:对象
构造器函数
1 function Hero(name){ 2 this.name = name; 3 this.occupation = 'Ninja'; 4 this.whoAreYou = function(){ 5 return "I'm" + this.name + " and I'm a " + this.occupation; 6 } 7 } 8 var h1 = new Hero('lyrecxn'); 9 h1.whoAreYou();
全局对象
构造器属性(constructor property)
instanceof操作符 测试一个对象是否由某个指定的构造器函数所创建的。
function C2(){this.a = 1; return {b : 2};}
var c2 = new C2();
内建对象:
数据封装类对象——包括Object、Array、Bollean、Number和String。这些对象代表着JavaScript不同的数据类型,并且都拥有各自不同的typeof返回值,以及undefined 和 null 状态。
工具类对象——包括Math、Date、RegExp等用于提供便利的对象。
错误类对象——包括一般性错误对象以及其他各种更特殊的错误类对象。
Object:
toString()方法、valueOf()方法、constructor属性
Array:
相当于属性名从 0 开始递增,并自动生成数值。
length属性
sort()方法、join()方法、slice()方法等
Function:
三种定义函数的方式,
属性:constructor、caller、prototype
方法:call()、apply()
重新认识arguments对象,function.argument
Boolean、Number、Math、Date:
String:
toUpperCase()与toLowerCase()、charAt、indexOf()。
slice()与substring()(对待负值的方式不同)
split()、concat()
RegExp:
属性:global,ignoreCase,multiline,lastIndex,source.前三个可以用regex修饰符来表示:gim。
方法:test(),exec().
以正则表达式为参数的字符串方法:match()、search()、replace()、split()
1 例子: 2 var email = "stoyan@phpied.com"; 3 var username = email.replace(/(.*)@.*/ , "$1"); 4 >>>username; 5 "stoyan"
回调式替换:
1 //回调式替换 2 var s = new String("HelloJavaScript") 3 function replaceCallback(match){ 4 return "_" + match.toLowerCase(); 5 } 6 s.replace(/[A-Z]/g, replaceCallback);
Error:
try catch throw finally