Skip to content

var关键字

  • var关键字声明的变量,可以存储任何类型的值(在不初始化的情况下,会存储一个特殊的值undefined)

var的作用域

  • 1、在全局环境中用var声明的变量是不会被销毁的
js
var test = 10;
function fn(){
  console.log(test); // 10
}
console.log(test); // 10
  • 2、在函数中用var声明的变量,属于局部变量,只在函数内部有效,在函数外部是不可见的,函数执行完毕后,函数内部的变量会被销毁
js
function fn(){
  var test = 10;
  console.log(test); // 10
}
console.log(test); // Uncaught ReferenceError: test is not defined

// 在函数内部如果有一个变量,没有用关键字声明函数执行完毕后,挂载到全局环境中
function fn(){
  test = 10;
}

3、var变量提升

  • 1、var声明的变量会被提升到当前作用域的最顶部
js
function fn(){
  console.log(test); // undefined
  var test = 10;
}
  • 2、var声明的变量会被提升到当前作用域的最顶部,但是不会提升到全局作用域
js
function fn(){
  console.log(test); // undefined
  var test = 10;
}

let关键字

  • 1、let声明的变量,在当前的代码块中有效
js
{
  let test = 10;
}
console.log(test); // ReferenceError: test is not defined
  • 2、变量不会存在类型提升
js
function test() {
  console.log(a);
  let a = 10;
}
test() // ReferenceError: Cannot access 'a' before initialization
  • 3、不允许重复声明
js
function test() {

  let a = 10;
  let a = 11; // SyntaxError: Identifier 'a' has already been declared
}
  • 4、存在暂时性死区

  • javascript在解析代码的时候,如果有let声明的变量,并且声明之前访问,就会报错,这就是暂时性死区

js
function test() {
  console.log(a);
  let a = 10;
}
test() // ReferenceError: Cannot access 'a' before initialization
  • 5、let在全局作用域中声明的变量,不会成为window对象的属性
js
// 浏览器环境下
let age = 10;

console.log(window.age); // undefined

const关键字

  • 1、const声明的变量,在声明的时候必须初始化,不能在声明之后再次赋值
js
const a = 10;
a = 11; // TypeError: Assignment to constant variable.
  • 2、如果用const声明的变量指向一个引用地址,可以改变这个引用地址的值,但是不能改变引用地址本身
js
const a = {
  name: 'test'
};
a.name = 'test1';
console.log(a.name); // test1

const、let、var最佳实践

  • 尽量使用const,只有在必要的时候才使用let,尽量不要使用var

数据类型

  • ECMAScript一共有6种简单的数据类型分别是:Undefined、Null、Boolean、Number、String、Symbol(ES6新增),还有一种复杂数据类型是Object(对象)。Object是无序的,可以包含其他任意类型值的对象。

Undefined类型

  • 当使用了var或let关键字声明了变量,但是没有赋值的时候,会默认赋值为undefined
js
let name;
console.log(name==undefined);// true

WARNING

注意:包含了undefined的值的变量根未定义变量的区别

无论是声明未赋值的,还是未声明的typeof都是undefined

js
let name;
console.log(name); // "undefined"
console.log(typeof age); // "undefined"
console.log(age); // Uncaught ReferenceError: a is not defined

Null类型

  • Null类型是一个特殊的值,表示一个空对象引用(空指针),常用于表示对象未初始化或为空值。
  • 在JavaScript最初的实现中,数据转成二进制后判断前2位如果是0,就代表是一个对象,null是一个空的地址,所有位都是0,所以typeof null 也因此返回 "object"
js
console.log(typeof null); // "object"
console.log(null == undefined); // true

Boolean类型

  • Boolean类型只有两个值:truefalse
  • 注意:在JavaScript中,0-0""nullundefinedNaN都会被转换为false,其他值都会被转换为true

Number类型

  • Number类型是浮点数,JavaScript的浮点数采用IEEE 754标准,这个标准定义了浮点数的表示方法,数值的表示范围,运算方式。
  • 浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。

Number的范围

  • Number的范围是-2^53 ~ 2^53,超过这个范围,就会变成Infinity,小于这个范围,就会变成-Infinity
  • 无穷大Infinity-Infinity可以相加,得到NaN

NaN

  • NaN表示非数值(Not a Number),NaN与任何值都不相等,包括它本身。
  • NaN与任何值包括它自己都不相等,包括NaN本身。
  • isNaN()函数可以判断一个值是否是NaN
  • 0,+0,-0 相除会返回NaN

如果分子是非0值,分母是有符号0或无符号0,则会返回Infinity或-Infinity

js
console.log(1/0); // Infinity
console.log(1/-0); // -Infinity

数值转换

  • 布尔值true转换为1,false转换为0。
  • 数值直接返回
  • null返回0
  • undefined返回NaN
  • 字符串转换为数值,如果字符串不能转换为数值,则返回NaN。
  • 对象转换为数值,首先调用对象的valueOf()方法,如果返回原始类型的值,则直接对该值进行转换。如果valueOf()方法返回的是对象,则调用该对象的toString()方法,将得到的字符串转换为数值。
js
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(1)); // 1
console.log(Number(undefined)); // NaN
console.log(Number('1')); // 1
console.log(Number('10a')); // NaN
console.log(Number({a:10}));// NaN
console.log(Number({valueOf(){return 10}})); // 10

String类型

字面量含义
\n换行
\t制表
\b退格
\r回车
\f换页
\\反斜杠
\'单引号
\"双引号

toString()数值二进制、八进制、十六进制转换

js
var num = 10;
console.log(num.toString()); // "10" 默认十进制
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"

Symbol类型

  • Symbol类型是ES6新增的类型,用来创建唯一标识符。
  • Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
  • Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的。
js
let s1 = Symbol('foo');
let s2 = Symbol('bar');
console.log(s1); // Symbol(foo)
console.log(s2); // Symbol(bar)
console.log(s1 === s2); // false
new Symbol('foo') // TypeError: Symbol is not a constructor

Symbol.for()和Symbol.keyFor()

  • Symbol.for()方法接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
  • Symbol.keyFor()方法返回一个已登记的Symbol类型值的key。
js
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
let s3 = Symbol.for('bar');
console.log(s1 === s2); // true
console.log(Symbol.keyFor(s1)); // "foo"

Object类型

  • Object类型是JavaScript中最复杂的类型,它表示一个对象,对象是由属性和属性值组成的。
  • 对象的每个属性或方法都有一个名字,而每个名字都对应一个值。
  • 属性的值可以是任意数据类型,包括对象。
  • new Object() 等价于 new Object