第二章 基础

通常认为在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

posted on 2017-02-27 18:03  MicN  阅读(1108)  评论(0编辑  收藏  举报