导言
重新看了一些 js 高级程序设计 , 发现之前有很多知识点没有融会贯通 , 没有系统性的去了解基础。 本文便是为了自己曾经仅仅是有所耳闻的基础 , 再加深一下。
- 语法
- 数据类型
- 流程控制语句
- 函数
语法
严格模式
ES5 引入了严格模式 (strict mode)的概念。严格模式是为 javaScript 定义了一种不同解析与执行模式。在严格模式下 , ES3中一些不确定的行为将得到处理, 而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"use strict"
这其实是一个编译指示 (pragma),用于告诉支持的 javaScript 引擎切换到严格模式。 这是为不破坏 ES3 语法而设计的语法。
也可以指定函数在严格模式下执行:
function doSomething() {
"use strict"
}
语句
label 语句
使用 label 语句可以在代码中添加标签,以便将来使用。 以下是 label 语句的语法:
label : statement
with 语句
with 语句的作用是将代码的作用域设置到一个特定的对象中。 with 语句的语法如下:
with (expression) statement;
定义 with 语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子一样:
let obj = {
name : 'zs',
like : '',
sex : '男'
}
with(obj) {
var name = name;
var like = like;
var sex = sex;
console.log(name); // zs
}
使用with 语句关联了 location 对象。 这意味着在 with 语句的代码块内部 , 每个变量首先被认为是一个局部变量 ,而如果在局部变量中找不到该变量的定义 , 就会查询 location 对象中是否有同名的属性。 如果发现了同名属性 , 则以 location 对象该属性的值作为变量的值。
严格模式下不允许使用 with 语句,否则将视为语法错误
由于大量使用with语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用 with语句
函数
函数声明基本如下:
function functiionName() {
}
严格模式对函数有一些限制:
- 不能把函数命名为 eval 或 arguments
- 不能把参数命名为 eval 或 arguments
- 不能出现两个命名参数同名的情况
如果发生以上情况, 就会导致语法错误,代码无法执行。
理解参数
ES函数与大多数语言中函数的参数不太一样。ES函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即使你定义的函数只接受两个参数,在调用这个函数时也未必一定要传递两个参数。
原因是ES中参数在内部是用一个数组来表示的
实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数
其实, arguments 对象只是与数组类似, 因为可以使用方括号语法访问它的每一个元素 , 使用 length 属性来确定传递进来多少个参数。
function sayHi() {
console.log(arguments[0])
}
sayHi(1); ;// 1
这个重写的函数中不包含命名的参数。虽然没有使用 name 和 message 标识符, 但是函数的功能依旧。
这个事实说明了ES函数的一个重要特点: 命名的参数只提供便利 , 但不是必需的。
另外, 在命名参数方面, 其他语言可能需要事先创建一个函数签名 , 而将来的调用必须与该签名一致。但 ES 中没有。
关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应的命名参数的值保持同步
function doAdd(num1 , num2) {
arguments[1] = 10;
console.log(arguments[0] + num2); // 11
}
doAdd(1,2)
每次执行 doAdd 函数都会重写第二个参数, 将第二个参数的值修改为10。
因为 arguments对象中的值会自动反映到对应的命名参数,所以修改 arguments[1], 也就修改了 num2。同理,修改了num2, arguments[1]也会跟着改变
但他们的内存空间的独立的,但是值会同步
arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的
关于参数还有记住最后一点:没有传递值的命名参数将自动被赋值给 undefined值
没有重载
ES函数不能像传统的语言那样实现重载。 比如在 java 中 , 可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。
如前所诉,通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿函数的重载