js高级程序设计学习-基本概念

848 阅读4分钟

导言

重新看了一些 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 中 , 可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。
如前所诉,通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿函数的重载