js 权威指南

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)
  • 所有对象的原型最终指向null;
 var obj = new Object;
 obj.__proto__.__proto__  // null
  • 查找自有属性(非继承来的)
    hasOwnProperty (ES5)

  • 通过 prototype 添加的属性和方法都是可枚举的,也就是for in的时候会遍
    历出来(可以通过Object.defineProperty添加属性), Object.keys() 会忽略继 承的属性

  • in 做类型检测的时候会包含继承属性

  • 通过__proto__属性可检测对象原型,但是并不推荐,因为IE没有此属 性,Object.prototype.isPrototypeOf()可以检测原型

只读属性
    var obj = {};
    Object.defineProperty(obj, "prop", {
        value: "test",
        writable: false
    });
禁止类的扩展
  • Object.preventExtensions 可以设置禁止添加任何属性,但是可删除原有属性
  • Object.seal 不可配置属性,但是可读可写
  • Object.freeze 只读不可配置

同源策略

限制范围
  • 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB(web端数据库)
  • 无法接触非同源网页的 DOM
  • 无法向非同源地址发送 AJAX 请求(可以发送,但浏览器会拒绝接受响应)。
  • 为了用户安全,浏览器端的脚本语言不能修改和删除本地文件(现在的HTML5中 chrome 实现了 webkitRequestFileSystem api, 可以自沙盒中操作文件, 其他浏览器并未测试)
不严格的同源策略
  • 可以通过 document.domain 来设置同源性
  • Cross-Origin 实现跨域 (详情请看 阮一峰)
  • h5 中的 window.postMessage

H5

  • 应用程序新增了应用缓存,由缓存清单决定缓存
  • window.postMessage 页面消息传递
  • web worker 从此以后js就不再是单线程了, web worker 线程不能访问dom, 它是一个独立的上下文
  • IndexedDB 非关系型数据库
  • Blob (很强大, 具体使用参考 此链接)
  • arrayBuffer
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容