JavaScript高程读书笔记(1)

2018-03-18  本文已影响6人  小懒豆

一、script标签

  1. async属性(只是适用于外部脚本文件)立即下载脚本,但不妨碍页面其他操作
  2. defer属性(只是适用于外部脚本文件)对脚本执行进行延迟,直到页面加载为止

二、noscript标签

  1. 浏览器不支持脚本
  2. 浏览器不支持脚本,但是脚本被禁用

三、严格模式

  1. 使用"use strict"开启严格模式;针对单个函数,将"use strict".0放在函数体的第一行
  2. 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。
"use strict";
v = 1; // 报错,v未声明
for(i = 0; i < 2; i++) { // 报错,i未声明
}
  1. 静态绑定
    (1)禁止使用with语句
    (2)创设eval作用域,正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
  1. 增强的安全措施
function f(){
  return !this;
} 
// 返回false,因为"this"指向全局对象,"!this"就是false
function f(){ 
  "use strict";
  return !this;
} 
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
function f1(){

 "use strict";

 f1.caller; // 报错

 f1.arguments; // 报错
}

f1();
  1. 禁止删除变量
    严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
"use strict";
var x;
delete x; // 语法错误
var o = Object.create(null, {'x': {
  value: 1,
  configurable: true
}});

  delete o.x; // 删除成功
  1. 显式报错
    (1)正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。
"use strict";
var o = {};
Object.defineProperty(o, "v", { value: 1, writable: false });
o.v = 2; // 报错

(2)严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。

"use strict";
var o = {
 get v() { return 1; }
};
o.v = 2; // 报错

(3) 严格模式下,对禁止扩展的对象添加新属性,会报错

"use strict";

var o = {};

Object.preventExtensions(o);

o.v = 1; // 报错

(4)严格模式下,删除一个不可删除的属性,会报错

 "use strict";

 delete Object.prototype; // 报错
  1. 重名错误
    严格模式新增了一些语法错误。
    (1)对象不能有重名的属性
    正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
  "use strict";

  var o = {
    p: 1,
    p: 2
  }; // 语法错误

(2)函数不能有重名的参数

正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。

  "use strict";

  function f(a, a, b) { // 语法错误

    return ;

  }
  1. 禁止八进制表示法

正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。

  "use strict";

  var n = 0100; // 语法错误
  1. arguments对象的限制

arguments是函数的参数对象,严格模式对它的使用做了限制。

(1) 不允许对arguments赋值

  "use strict";

  arguments++; // 语法错误

  var obj = { set p(arguments) { } }; // 语法错误

  try { } catch (arguments) { } // 语法错误

  function arguments() { } // 语法错误

  var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误

(2) arguments不再追踪参数的变化

  function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式为[2,2]
  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
 }
  f(1); // 严格模式为[2,1]

(3) 禁止使用arguments.callee

这意味着,你无法在匿名函数内部调用自身了。

  "use strict";

  var f = function() { return arguments.callee; };

  f(); // 报错
  1. 函数必须声明在顶层

将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

  "use strict";

  if (true) {

    function f() { } // 语法错误

  }

  for (var i = 0; i < 5; i++) {

    function f2() { } // 语法错误

  }
  1. 保留字

为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield

使用这些词作为变量名将会报错。

  function package(protected) { // 语法错误

    "use strict";

    var implements; // 语法错误

  }

此外,ECMAscript第五版本身还规定了另一些保留字class, enum, export, extends, import, super,以及各大浏览器自行增加的const保留字,也是不能作为变量名的。

四、数据类型

  1. 简单数据类型
  1. 复杂数据类型
  1. typeof

'undefined'//对应这个值未定义
'boolean'//对应这个值是布尔值
'string'//对应这个值是字符串
'number'//对应这个值是数值
'object'//对应这个值是对象或者null
'functon'//对应这个值是函数

  1. Boolean
数据类型 转换为true的值 转换为false的值
String 非空字符串 空字付串
Number 非零值 0和NaN
Object 任何对象 null
Underfined underfined
  1. Number
    (1)浮点数最高精度 17位小数。
    (2)数值范围(5e-324,1.7976931348623157e+308),超出范围位Infinity,可以用isFinite()判断是不是超出范围。
    (3)NaNisNaN()函数会尝试把参数转换为数值类型。
  1/0   //Infinity
  -1/0  //-Infinity
  0/0   //NaN

(4)数值转换

  1. String
    1).字符串一旦创建不可改变
    2).转换为字符串:第一种使用toSting()方法,如果是null或者undefined就输出字面量
  2. Object
    每个实例都有的属性和方法
constructor()//保存着用于创建当前对象的函数
hasOwnProperty()//用于检查给定的属性在当前实例中(不是实例的原型)是否包含存在
isPrototypeOf()//用于检查传入的对象是不是当前对象的原型
propertyIsEnumerable()//用于检查给定的属性是否可以for-in来枚举
toLocaleString()//返回对象的字符串表示
toString()//返回对象的字符串表示
valueOf()//返回对象的字符串,数值或者布尔表示
上一篇 下一篇

猜你喜欢

热点阅读