JavaScript基础

现代模式,“use strict”

长久以来,JavaScript不断向前发展并且未带来任何兼容问题,新的特性被加入,旧的功能也没有改变,这么做的缺点是JavaScript创造者的任何错误或不完善的决定也将永远被保留在JavaScript语言中,直到2009年ES5的出现,ES5规范增加了新的语言特性并且修改了一些已经存在的特性,为了保证旧的功能能够使用,大部分修改是默认不生效的,除非使用use strict来明确地激活这些特性。

“use strict”

这个指令看上去像一个字符串“use strict”或者‘use strict’。当它处于脚本文件的顶部时,整个脚本都将以“现代”或者说是严格模式进行工作。

"use strict"
// 代码以严格模式工作

当指令被放在函数体开头时,可以只在该函数中启用严格模式,但通常应该在整个脚本中启用严格模式。
需要确保use strict出现在脚本的最顶部,否则严格模式可能无法启用。
这里的严格模式就没有被启用:

alert("some code")
//下面的“use strict”会被忽略

"use strict"
//严格模式没有被激活

只有注释可以出现在use strict的上面,没有办法取消use strict,没有类似于no use strict这样的指令
现代JavaScript支持“classes”和“modules”,它们会自动启用use strict

变量

变量声明有三种方式

  1. let
  2. const
  3. var

var与let相似,大部分情况下,我们可以用let代替var,但实际上并不建议使用var

"var"没有块级作用域

用var声明的变量,不是函数作用域就是全局作用域。它们在代码块外也是可见的。

if (true) {
   var test = true;
}
alert(test); //true, 变量在if结束后仍然存在

由于var会忽略代码块,因此我们有了一个全局变量test,如果在第二行使用let而不是var,那么该变量将仅在if内部可见。对于循环也是如此。

"var"声明的变量,可以在其声明语句前被使用

当函数开始的时候,就会处理var声明(脚本启动对应全局变量)
换言之,var声明的变量会在函数开头被定义,与它在代码中定义的位置无关(不考虑嵌套函数的情况)

function sayHi() {
  phrase = "Hello";
  alert(phrase);
  var phrase;
}

从技术上讲,它与下面这种情况是一样的

function sayHi() {
  var phrase;
  phrase = "Hello";
  alert(phrase);
}

甚至与这种情况也是一样的

function sayHi() {
  phrase = "Hello";
  if(false) {
   var phrase;
  }
  alert(phrase); //代码块级作用域被忽略
}

这种行为被称为提升,即所有的var声明都会被提升到函数的顶部,需要注意的是声明会被提升,但是赋值不会。

"var"允许重新声明

如果使用let在同一作用域下将同一个变量声明两次,会出现错误。

let user;
let user; //SyntaxError:'user' has already been declared

使用var,我们可以重复声明一个变量,不管多少次都行。如果对一个已经声明的变量使用var,这条新的声明语句会被忽略

var user = "Pete";
var user = "Jhon";
alert(user); // John

ES5之前通过IIFE的方式解决这个问题,而现在应尽量避免使用var关键字,通过let和const来声明变量

数据类型

JavaScript中的值都有特定的类型,共有8种基本的类型(7种原始类型和1种引用类型),JavaScript是一门动态类型语言,意思是虽然有不同的数据类型,但是定义的变量并不会在定义后,被限制为某一数据类型。

  1. Number类型
    number类型代表整数和浮点数,同时还有特殊数值Infinity(正无穷大)、-Infinity(负无穷大)、NaN(非数)。

  2. BigInt类型
    number类型无法表示大于9007199254740991的整数,此时可用BigInt,用于表示任意长度的整数
    通过将n附加到整数末尾来创建BigInt值。

const bigInt = 123456789123456789123456n
  1. String类型
    双引号:"Hello"
    单引号:'Hello'
    单引号和双引号没有区别
    反引号用于嵌入表达式。
let name = "John";
alert(`Hello, ${name}`); // Hello, John
  1. Boolean类型

  2. “null"值
    JavaScript中的null不是一个对不存在的object的引用或者null指针,而仅仅是一个代表"无”、"空"的特殊值

  3. "undefined"值
    特殊值undefined和null一样自成类型,含义是未被赋值,如果一个变量已被声明但是未被赋值,那么它的值就是undefined

let age;
alert(age);//弹出undefined
  1. object类型
    一个特殊的类型,用于存储数据集合和更复杂的实体。

  2. symbol类型
    用于创建对象的唯一标识符

值的比较

字符串比较大小时,会使用字典序进行判定。
不同类型值进行比较时会先转换为数字再判定大小。
普通的相等性检查==不能区分出0和false,也无法区分空字符串和false。
相等性检查与普通的> < >= <=的代码逻辑是相互独立的,进行值的比较时,null会被转换成数字,即为0,而在相等性检查时不会发生类型转换。

"2" > "12" true
undefined == null true
undefined === null false
null == "\n0\n" false
null == 0 false
null >= 0 true
null === +"\n0\n" false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值