JavaScript高程读书笔记(1)

一、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. 增强的安全措施
  • 禁止this关键字指向全局对象
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. 简单数据类型
  • Undefined
  • null
  • Boolean
  • Number
  • String
  1. 复杂数据类型
  • Object(本质是一组无序的名值对)
  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)数值转换

  • parseInt():第二个参数可以指定进制
    parseInt()函 数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。
    如果第一个字符不是数字字符或者负 号,parseInt()就会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN(Number()对空字符串返回0)。
    如果第一个 字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
    例如,“123blue”会被转换为 1234,因为“blue”会被完全忽略。类似地,“22.5”会被转换成22,因为小数点并不是有效的数字字符。
    如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即十进制、八进制、十六进制)。
    也就是说,如果字符串以 “0x”开头且后跟数字字符,就会将其当作一个十六进制整数;如果字符串以“0”开头且后跟数字字符,则将其当作一个八进制数来解析。
  • parseFloa()
    parseInt()类似,只是一个小数点有效,第二个以后的忽略。只解析十进制,十六进制转换为0
  • Number()
    1)如果是Boolean值,true和false将分别转换为1和0。
    2)如果是数字值,只是简单的传入和返回。
    3)如果是null值,返回0。
    4)如果是undefined,返回NaN。
    5)如果是字符串,遵循下列规则:
  • 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);
  • 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
  • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其他转换为相同大小的十进制整数值;`
  • 如果字符串是空的(不包含任何字符),则将其转换为0;
  • 如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.
    6)如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
  1. String
    1).字符串一旦创建不可改变
    2).转换为字符串:第一种使用toSting()方法,如果是null或者undefined就输出字面量
  2. Object
    每个实例都有的属性和方法
constructor()//保存着用于创建当前对象的函数
hasOwnProperty()//用于检查给定的属性在当前实例中(不是实例的原型)是否包含存在
isPrototypeOf()//用于检查传入的对象是不是当前对象的原型
propertyIsEnumerable()//用于检查给定的属性是否可以for-in来枚举
toLocaleString()//返回对象的字符串表示
toString()//返回对象的字符串表示
valueOf()//返回对象的字符串,数值或者布尔表示

你可能感兴趣的:(JavaScript高程读书笔记(1))