js 权威指南

2019-01-02  本文已影响8人  自然萌_
js 采用的是 二进制浮点数, 在运算符取值的时候是四舍五入
 0.3 - 0.2 = 0.9999999999999999
字符串比大小其实比的是 ASCII 码值, js 字符串是由 ASCII 值来表示 unicode
'two' > 'three'  // 因为 tw 在 ASCII 表中的值 大于 th
合理的分号
var y = x + y
( a + b ).toString()

这段代码会被编译器编译

var y = x + y( a + b ).toString()

很显然这并不是我们想要的
 
null 和 undefined

null是js中的关键字, 为特殊的对象. undefined 表示值未初始化, es5 之前 undefined 可读可写 , es5之后只可读

 typeof null // object
 typeof  undefined // undefined
js 采用的是词法作用域, 变量提升(声明提前)

es6 之前没有块级作用域, 只有函数作用域, 每一个函数会生成一个 作用域对象, 对象上记录所有声明属性.

eval 函数

直接的eval函数更改局部变量,间接的eval更改全局变量

var geval = eval
var x = 'global', y = 'global';
function f() {
    var x = 'local';
    eval("x += 'changed';");
    return x;
}

function g() {
    var y = 'local';
    geval("y += 'changed';");
    return y;
}
console.log(f(), x); // 更改了局部变量: 输出 localchanged, global
console.log(g(), y); // 更改了全局变量: 输出 local ; globalchanged;
prototype(原型链)
通过原型链直接继承, 这种方式不用创建实力节省内存,但是Dog 和 Animal 的 
prototype 指向同一个对象,对 Dog.prototype 的修改会反应在 Animal 上
这并不是我们想要的

 function Animal() {
     this.name = 'animal';
 }

 function Dog() {
     this.age = 8;
 }

 Dog.prototype = Animal.prototype;

 Dog.prototype.constructor = Dog;

 Dog.prototype.sex = '男'

 var animal = new Animal();

 console.log(animal.sex) // 输出 男

 通过原型链间接继承

 function Animal() {
     this.name = 'animal';
 }

 function Dog() {
     this.age = 8;
 }

 Dog.prototype = new Animal();

 Dog.prototype.constructor = Dog;

 var dog1 = new Dog();

 var animal = new Animal();

参考  [阮一峰](http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html)
 var obj = new Object;
 obj.__proto__.__proto__  // null
只读属性
    var obj = {};
    Object.defineProperty(obj, "prop", {
        value: "test",
        writable: false
    });
禁止类的扩展

同源策略

限制范围
不严格的同源策略

H5

上一篇 下一篇

猜你喜欢

热点阅读