一。词法结构
1.区分大小写
2.注意//单行/*多行注释*
3.字面量(直接量 literal)
12 //数字
5.8 //小数
“hello”
‘hello’
true
/js/gi //正则
null //空
{x;1,y:2}
[1,2,3,4]
- 标示符{变量}和保留字
- 分号可以省略但是可能产生问题,js会自动补;
var y = x+f
(a+b).toString()
等价于
var y = x+f(a+b).toString();
二.类型。值和变量
1.原始类型 数字。字符串和布尔 null空 undefined 未定义
2. 对象类型
3.类 Array Function Date RegExp Error
4.js 解析器 中集成了垃圾回收
5.任意js的值dou可以转为布尔值
undefined
null
0
-0
NaN
“”都被转换为false
6.包装对象
var s=“hello”; //原始类型(没有方法)
s.len = 4; //当调用原始类型的属性或方法的时候(原始类型是没有属性和方法的)
//只要引用了字符串的属性或方法,就会调用new String(s)把原始类型,包装成对象
//以后只要调用s.len 是调用String对象的属性和方法,一旦引用结束,新创建的临时对象会销毁
var n = s.len; //此时为undefined
alert(n);
//调用字符串 布尔 数字的属性或方法时,创建的临时对象。是包装对象 显示定义包装对象 var S=new String(“hello”)
var s= “hello”: 是不同的
7.== 和 ===
==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase。
8.类型转换
var n = 17;
alert(n.toString(2)); //二进制 10001
alert (n.toString(8)); // 021
alert (n.toString(16)); //0✖21
alert (n.toString (10)); alert(n.toString());
9.toString() valueOf()
var date = new Date(2011,1,3);
date.valueOf() 返回毫秒数代表的时间
10.JS是动态类型 var n = 10; 程序运行期间 才会确定变量的类型
11. 变量作用域
函数作用域和声明提前
函数内定义的变量 声明自动提前到函数顶部
12. 作用域cope chain
在不包含函数的函数体内,作用域链有两个对象,第一个是定义函数.参数和局部变量的对象,第二个是全局对象。在一个嵌套函数体内,作用域链上至少有三个对象。定义一个函数时,它保存了一个作用域链调用函数时,它创建一个新的对象存储它的局部变量,并将这个对象添加到保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的“链”。对于嵌套函数每次调用外部函数时,内部函数会重新定义一遍。每次调用外部函数的时候作用域链是不同的。
13. delete in eval void
第 一章 对象
- 对象的基本操作 create set query delete test enumerate
- 对象的属性特性 可写 可枚举 可配置(是否可删除)
- 对象的对象特性
对象的原型 prototype
对象的类 标示对象类型的字符串
对象的扩展标记 是否可添加新属性
//创建对象的三种方法
- 对象直接量
var empty={};
var point = {x:0,y:0};
- new创建对象
var 0 = new Object{}; //空对象 和{}一样
var a = new Array{};
- Object.create{}
var o1 = Object.create{(x:1,y:2)}; //o1 继承自对象原型{x:1,y:2}
var o2 = Object.create{null};//o2不继承任何属性和方法
var o3 = Object.create(Object.prototype);
//空对象和{}new Object()一样
7.属性的操作 作为关联数组的对象
object.property
object["property"] 散列 映射 字典 关联数组
8.继承
js的继承只能从父类获取属性的值,而不能修改原型链
如果对象book为null或undefined
book.subtitle.length会报错
解决方法
var len = book && book.subtitle && book.subtitle.length;
删除属性
delete book.subtitle
检测属性 in hasOwnPreperty() propertyIsEnumerable()
var o = {x:1};
"x" in o
"toString" in o
hasOwnPreperty{};判断属性是否是自己的。继承属性返回false
propertyIsEnumerable()只有是自有属性,并可枚举
获取所有属性
Object.keys()
Object.getOwnPropertyNames()
9.属性getter和setter
var o = {
x: 0,
y: 1,
set r(value) { value = this.r;},
get r() { return this.x + this.y;}};
x数据属性,r存取器属性
10.属性的特性 ecmascript5 老的ie不支持如下用法
数据属性的特性:值value 可写性writable
可枚举enumerable
可配置configurable
存取器属性特性:get set
可枚举enumerable
可配置configurable
//返回{value:1,writable:true,emunerable:true,configurable:true}
Object.getOwnPropertyDescriptor({x:1},x)
//查不到属性 返回undefined
设置属性的特性 不能修改继承的属性特性
Object.defineProperty()
//设置不可枚举属性
var o = {};
Object.defineProperty(o,"x",{
value:1,
writable:true,
emunerable:false,
configurable:true
})
//设置只读
Object.defineProperty(o,"x",{writable:false})
修改多个属性特性
Object.defineProperties()
扩展Object.prototype 书 P137
11.对象的三个属性
prototype class extensible attribute
查询对象的原型
ecmascript5中 Object.getPrototypeOf(o1)
ecmascript3中 o1.constructor.prototype
通过对象直接量或new Object()方式创建的对象
包含一个constructor的属性,指Object()的构造函数
constructor.prototype才是真正的原型
p.isPrototypeOf(o)检测对象p是否是o的原型
//获取对象的类型 字符串
Object.prototype.toString.call(o1).slice(8,-1)
12.对象的可扩展性
对象是否可以新加属性
Object.preventExtensions() 设置对象不可扩展
Object.isExtensible()
Object.seal() 除了将对象设置为不可扩展,还将属性设置为不可配置
Object.freeze()
除了将对象设置为不可扩展,将属性设置为不可配置,还把属性设置为只读
第8章 函数
1.函数调用,方法调用
function t(){ }
t(); 函数调用 this是全局对象 严格模式下是undefined
var o = {a:function(){}};
o.a() 方法调用 this是当前调用的对象
2.构造函数调用
var o = new Object(); var o= new Object;
o继承自构造函数的prototype属性 内部的this是此对象
var r = new o.m();中的this不是o
3.P184 函数的执行用到了作用域链,这个作用域链是函数定义的时候创建的。
嵌套的函数f()定义在这个作用域链里,其中的变量scope是局部变量
作用域链
调用s()将创建函数s的执行环境(调用对象),并将该对象置于链表开头,然后将 函数t的调用对象链接在之后,最后是全局对象。然后从链表开头寻找变量name 调用ss() ss() ==> t() ==> window
name="lwy";
function t(){
var name="tlwy";
function s(){
var name="slwy";
console.log(name);
}
function ss(){
console.log(name);
}
s();
ss();
}
t();
每次调用函数,都会生成一个新的作用域链。包括新的内部变量