JavaScript 读书笔记(一)

206 阅读5分钟

一、语法

1、标识符:

1、应以字母开头,可以包含一个或多个字母、数字,下划线(javascript规范中标识符可以包含字母、数字、_、$的组合,但不能以数字开头)

2、数字

1、内部是一个64为的浮点型数。不区分浮点型和整形,只需要知道是一个数。

2、可以声明含有指数部分的数字字面量,3.14e10 表示3.14 乘以10的10次方。

3、负数可以用前置的-表示

4、NaN 是一个数值,表示不能产生正常结果的运算结果,NaN不表示任何值,包括它自己。 isNaN(number)检测NaN。

5、infinity 表示所有大于 1.7976931348623157e+308 的数

3、字符串

1、字符串,可以包含在单引号和双引号之中。

2、反斜线\ 表示转义。\u 约定用来指定数字字符编码。

3、字符有一个length属性,表示字符长度"hello".length

4、字符串是不可变的一旦创建就不能改变它,可以用 + 号连接两个字符串,生成一个新的字符串

4、语句

1、不像其他语言,JavaScript中的代码不会创建新的作用域,因此变量应该定义在函数的头部,而不是代码块中

2、false、null、undefined、空字符串""、数字0、数字NaN 会被当成false 其他所有值都会被当成真

3、for in 语句会枚举一个对象的所有属性名,常用 object.hasOwnProperty(属性名) 来确定一个属性名是对像成员

二、对象

1、概述

1、JavaScript的简单数据类型包括数字、字符串、布尔值、null、undefined值,其他值都是对象。

2、javaScript中的对象是可变的键控集合,在JavaScript中数组是对象,函数是对象,正则表达式是对象,对象也是对象

3、对象是属性的容器,每个属性都有名字和值,属性的名字可以是包含空字符串的任意字符,属性值是可以除了undefined之外的任何值

4、象用于汇集和管理数据,对象可以包含其他对象,JavaScript对象是无类型的。对新属性的名字和属性的值没有限制

5、JavaScript 包含一种原型链的特征,允许对象继承另一个对象的属性,正确使用能减少对象的初始化消耗时间和内存

2、字面量创建对象

对象字面量创建对象,一个字面量就是包围在一对花括号中的零个或多个名/值对。对象字面量可以出现在任何表达式出现的地方。

var empty_object = {};
var stooge = {
    "first-name": "Jerome",
    "last-name": "Howard"
};

属性名可以包含空字符串在内的任意字符串,也就是说属性名可以不是标识符。如果属性名是合法的标识符则可以省略""号

var flight = {
    '':"hello",//属性名可以包含空字符串
    airline: "Oceanic",
    number: 815,
    departure: {
        IATA: "SYD",
        time: "2004-09-22 14:55",
        city: "Sydney"
    },
    arrival: {
        IATA: "LAX",
        time: "2004-09-23 10:42",
        city: "Los Angeles"
    }
};

3、检索属性

如果属性是一个合法的标识符,有两种方式获取属性值 “[]” 和 “.” ,如果属性只是一个字符串则只能用[] 获取属性

var s = stooge["last-name"];
s = stooge["first-name"];
s = flight[""];
s = flight["airline"];
s = flight.airline;
s = flight.departure.IATA;

如果获取的属性不存在会返回undefined

s = flight["hello"];
console.log(s);
s = flight.abc;
console.log(s);

可以用||来为属性填充一个默认值

var middle = stooge["middle-name"] || "(none)";
var status = flight.status || "unknown";

从undefined的属性中获取值会抛出异常,可以使用&&来避免

flight.equipment                              // undefined
flight.equipment.model                        // throw "TypeError"
flight.equipment && flight.equipment.model    // undefined

对象里的值可以通过赋值语句更新,若属性存在替换更新属性,若不存在则扩充添加到都对象中

stooge['first-name'] = 'Jerome';
stooge['middle-name'] = 'Lester';
stooge.nickname = 'Curly';
flight.equipment = {
    model: 'Boeing 777'
};
flight.status = 'overdue';

对象之间通过引用来传递,永远不会复制。 每个对象都有一个原型对象,并且可以从中继承属性。通过字面量创建的属性都连接到Object.prototype,他是javaScript的标配对象。对象字面量创建的对象可以用obj.proto 获取原型对象

console.log(flight.__proto__ == Object.prototype);//true
console.log(flight.__proto__);

检索属性若对象没有这个属性会从对象原型中找,如果原型中也没有会从原型的原型中找依此类推最终到达Object.prototype,若还是没有就返回undefined,这个过程称为委托

原型是动态的。像原型对象中添加一个属性,所有基于该原型的对象都可见

var per1 = {
    name:"zhangsan",
    age:19
};
var per2 = {
    name:"ergou",
    age:18
}
console.log(per1.hello);//undefined
console.log(per2.hello);//undefined
Object.prototype.hello = "hello";
console.log(per1.hello);//hello
console.log(per2.hello);//hello

4、反射

typeof 返回变量的类型 obj.hasOwnProperty() 如果属性是对象自己独有的返回true

typeof flight.number      // 'number'
typeof flight.status      // 'string'
typeof flight.arrival     // 'object'
typeof flight.manifest    // 'undefined'
typeof flight.toString    // 'function'
typeof flight.constructor // 'function'
flight.hasOwnProperty('number')         // true
flight.hasOwnProperty('constructor')    // false

5、枚举

for in 语句可以遍历出一个对象的所有属性,包括函数和原型中的属性。可以用typeof、hasOwnProperty() 过滤掉不想要的属性。属性名的顺序是不确定的

6、删除对象属性

delete运算符可以用来删除对象中的属性,不会删除原型中的属性。删除对象中的属性可能会让原型中的属性透现出来

7、减少全局变量污染

JavaScript可以随意的定义全局变量,全局变量可能带来不必要的麻烦。可以只定义一个全局对象作为变量容器

var MYAPP = {};
MYAPP.stooge = {
    "first-name": "Joe",
    "last-name": "Howard"
};
MYAPP.flight = {
    airline: "Oceanic",
    number: 815,
    departure: {
        IATA: "SYD",
        time: "2004-09-22 14:55",
        city: "Sydney"
    },
    arrival: {
        IATA: "LAX",
        time: "2004-09-23 10:42",
        city: "Los Angeles"
    }
};