第三章:语言基础
目录
- 语法
- 变量
- var
- let
- const
- 数据类型
- typeof操作符
- Undefined类型
- Null类型
- Boolean类型
- Number类型
- String类型
- Symbol类型
- Object类型
1.语法
- 区分大小写
- 标识符
- 所谓标识符,就是变量,函数,属性或者函数参数的名称。可以由一个或者多个字母,下划线,美元符号或数字组成(首个字符必须是字母)ECMAScript标识符使用驼峰大小写形式,也就是第一个字母小写,后面每个单词的首字母大写(非强制)
- 注释同C语言,单行注释 两个正斜杠,多行注释 一个正斜杠和一个星号开头,以它们的反向组合结尾
-
语句的分号可加可不加,if之类的控制语句最好在控制语句中使用代码块
- 现代浏览器都支持严格模式,对脚本启用严格模式,在脚本开头加上一行
"use strict"
也可以单独一个函数在严格模式下执行,只要把预处理命令放在函数体开头就好了
function hi(){
"use strict";
//函数体
}
2.变量
ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据,每个变量不过是一个用于保存任意值的命名占位符。有三个关键字可以声明变量:var const 和let,其中const和let只能在ES6及之后的版本中使用。
2.1var
使用var 操作符定义的变量会成为包含它的函数的局部变量
比如:
function test(){
var num = 1; //局部变量
}
console.log(num); //出错
在函数内定义变量时省略var操作符则可以创建一个全局变量
比如:
function test(){
num =1
}
console.log(num) //输出 1
注意:虽然可以通过省略var 操作符定义全局变量,但是不推荐这么做,在局部作用域中定义的全局变量很难维护,也会造成困扰,在严格模式下,如果给未申明的变量赋值,则会抛出ReferenceError
使用var声明的变量会自动提升到函数作用域顶部,所谓的提升就是将所有变量的声明拉到函数作用域的顶部。此外,反复多次使用var声明同一个变量也没有问题。
2.2let
let 跟var 的作用差不多,最明显的区别是,let声明的范围是块作用域,var声明的范围是函数作用域
if(true){
var name = "Matt"
console.log(name) //Matt
}
console.log(name) //Matt
if(true){
let name= "Matt"
console.log(name) //Matt
}
console.log(name) //ReferenceError
暂时性死区
let与var 的另外一个区别是:let声明的变量不会在作用域中被提升。
console.log(name)
var name = "Matt" // undefined,变量声明了没有定义(赋值)
console.log(name) //ReferenceError,变量没有声明,找不到
let name = "Matt"
在let声明变量之前的执行瞬间被称为暂时性死区,在暂时性死区引用后面才声明的变量都会抛出ReferenceError
与var 关键字不同,使用let在全局作用域声明的变量不会成为window对象的属性(var声明的变量会)
var name = "Matt"
console.log(window.name) //Matt
let age = 18
console.log(window.age)// undefined
for循环中的let声明
在let出现之前,for循环定义的迭代变量会渗透到循环体外部
for(var i = 5;i<10;i++)
{}
console.log(i)//10
改用let后,这个问题就消失了,因为迭代变量的作用域仅限于for循环内部
常见的题目
for(var i=0;i<5;i++){
setTimeout(()=>console.log(i),0) // 55555
}
将var 改用为let 后输出 12345
2.3const
const的行为与let基本一致,唯一一个重要的区别:const声明变量的同时必须初始化变量,且无法修改该变量。
最后,在实际使用中应该不使用 var ,优先使用const,其次是let
3.数据类型
JavaScript 有六种简单数据类型 Undefined,Boolean,Null,Number,String,Symbol(ES6新增的),一种复杂数据类型 Object。
3.1.typeof 操作符
对一个值使用typeof操作符会返回下列字符串之一
- "undefined"表示未定义
- "boolean"表示值为布尔值
- "string"表示值为字符串
- "number"表示值为数值
- "symbol"表示值为符号
- "object"表示值为对象(不是函数)或null
- "function"表示值为函数
图解:
小结一下:比较特殊的,typeof( null )== object ,typeof ( Function) == function,严格来说,函数在ECMAScript中被认为是对象,不是一种数据类型。
问题:为什么typeof(null)== object ?
答:null值表示一个空对象的引用。
3.2Undefined类型
声明但是未初始化的变量输出为undefined
let name
console.log(name) //undefined
未声明的变量输出会报错,输出其类型为undefined
console.log(name) //报错
console.log(typeof name) //undefined
undefined为假值,Number(undefined) == 0
3.3Null类型
逻辑上讲,null表示一个空对象指针,这也是typeof传一个null会返回object的原因。
在定义将来要保存为对象值的变量时,建议使用null来初始化。后面只要检查其值是否为null就可以知道它是否被重新赋值了。
undefined值是由null值派生过来,因此,ECMA-262将它们定义为表面上相等,console.log(undefined==null)//输出 true,类型发生了转换
null是一个假值 Number(null)==0
3.4Boolean类型
数据类型 | 转换为true | 转换为false |
Boolean | true | false |
Undefined | 不存在 | undefined |
Null | 不存在 | null |
Number | 非零数值(包括无穷) | 0,NAN |
String | 非空字符串 | “” (空字符串) |
Object | 任意对象 | null |
3.5Number类型
Number类型使用IEEE754格式表示整数和浮点数(在某些语言中也叫双精度值)
最小值:Number.MIN_VALUE,最大值:Number.MAX_VALUE
正无穷值:Infinity,负无穷值:-Infinity
NAN (Not a Number),用来表示本来要返回数值的操作失败了,比如除数为零的情况:console.log(0/0)
任何涉及NAN的操作始终返回NAN。
NAN不等于包括NAN的任何值,console.log(NAN == NAN) //false
isNAN()函数,用于判断参数是否“不是数值”,也就是说,看这个值能否转换为数值
- isNAN(NAN)//true
- isNAN("78")//false
- isNAN("red")//true
数值转换
有三个函数可以将非数值转化为数值:Number(),parseInt(),parseFloat()
Number()是转型函数,可用于任何数据类型
parseInt()和parseFloat()主要用于将字符串转换为数值。
Number()函数转换规则:
- 布尔值,true转换为1,false转换为0
- 数值,直接返回
- null,返回0
- undefined,返回NAN
- 字符串,含有数值字符的包括其加减号转换为一个十进制的值
- 其它进制的数统一转换为十进制
- 空字符串返回0
- 其他情况返回NAN
3.6String类型
String(字符串)数据类型表示零或多个16位Unicode字符序列,字符串可以使用双引号,单引号,或反引号标识,注意前后标识的一致性
3.6.1字符字面量
字符串数据类型包含一些字符字面量,用于表示非打印字符或有其他用途的字符,记几个常用的: \n 换行,\t 制表,\\ 反斜杠,\'单引号,\''双引号,\`反引号
3.6.2字符串的特点
ECMAScript的字符串是不可变的,要修改其值,必须先销毁原值
3.6.3转换为字符串
- toString()方法,null和undefined值都没有toString()方法,多数情况下,tostring()不接受参数,不过,在数值调用方法时,tostring()方法可以接收一个底数参数,比如
let num = 10
console.log(num.tostring(16)) // a
- String()方法,规则:
- 如果值有toString()方法,则调用该方法(不传参数)
- 如果值为null,返回"null",值为undefined,返回"undefined"
-
用加号操作符给一个值加上空字符串""也可以将其转换为字符串
3.6.4模板字面量
模板字面量在定义模板时特别有用,比如下面这个HTML模板:
let pageHTML = `
<div>
<a href='#'>
<span>Jake</span>
</a>
</div>
`
模板字面量会保持反引号内部的空格。
3.6.5字符串插值
字符串插值通过${}中使用一个JavaScript表达式来实现
3.7Symbol类型
Symbol(符号)是ECMAScript6新增加的数据类型。
符号是原始值,且符号实例是唯一,不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。
符号的基本用法
let sym = Symbol()
console.log(typeof sym) //symbol
3.8Object类型
ECMAScript中的对象是一组数据和功能的集合。
ECMAScript中的Object是派生其它对象的基类。Object类型的所有属性和方法在派生的对象上同样存在。
每个object实例都有如下属性和方法。
- constructor:用于创建当前对象的函数。
- hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性。
- isPrototypeOf(Object):用于判断当前对象是否为另外一个对象的原型
- propertyIsenumerable(propertyName):用于判断给定的属性是否可以使用
- toLocalString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境
- toString():返回对象的字符串表示
- valueOf():返回对象对应的字符串,数值或布尔值表示。通常与toString()返回值相同。