JavaScript 笔记 - XiaoMeimei/Notes GitHub Wiki

1. 要特别注意相等运算符==。JavaScript在设计时,有两种比较运算符:

  第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;

  第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

  由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。

2. null和undefined

  null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。

  在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。

  JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。

3. strict模式

  JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量。为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。启用strict模式的方法是在JavaScript代码的第一行写上: 'use strict';

  • var:

  使用var语句声明的变量的作用域是当前执行位置的上下文:一个函数的内部(声明在函数内)或者全局(声明在函数外)。

  • 非声明变量:

  给一个非声明变量赋值会隐式创建一个全局变量(造成代码污染)(全局object的一个属性)。不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性。声明变量(Declared Variable)和非声明变量(Undeclared Variable)的区别是:

(1)声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的。

(2)声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建。

(3)声明变量是它所在上下文环境的不可配置属性(non-configurable property),非声明变量是可配置的(例如非声明变量可以被删除)。

  变量提升:由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明。这意味着变量可以在声明之前使用。

  • let:

    let声明了一个块级域的局部变量,并且可以给它一个初始化值。

    let 允许把变量的作用域限制在块级域中。与var不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。

  • const:

  const 声明创建一个只读的常量。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次。(注意区分常量的值和常量指向的值的不同),常量拥有块级作用域。

4.window.location.href 和ajax区别

  a.在只需要局部刷新的地方,用户体验好

  b.用户看不到提交的参数,安全性好