js语法和数据类型之字面量

545 阅读4分钟

什么是字面量:语法表达式定义的常量;或者说,通过由一定字词组成的语词表达式定义的常量

mdn中是这么说,但还是很模糊。其实值就是字面量,然后将其赋给变量。不同类型的值也就是不同的字面量(而不同的字面量自有其规定的语法)

1.数组字面量:

数组字面值:[]包含的零个,多个的表达式的列表,其中的表达式就是数组元素

var arr = [] =>这就是数组字面值
它可以有0 or 多个表达式
['表达式1','表达式2'] =>其中表达式也称为 (元素)

数组字面值 也是 数组对象

多余逗号之间会产生元素值是undefined,除了尾部多余逗号会被忽略

最后的,被省略,这个元素是不存在的,故arr3的长度只有5
var arr3 = [,1,,3,,] //undefined,1,undefined,3,undefined

最好对缺失的元素,显式的声明为undefined,提升代码清晰度和可维护性

无法理解

  • 备注: 这里的数组字面值也是一种对象初始化器。参考对象初始化器的使用。

  • 若在顶层(全局)脚本里用字面值创建数组,JavaScript语言将会在每次对包含该数组字面值的表达式求值时解释该数组。 另一方面,在函数中使用的数组,将在每次调用函数时都会被创建一次。(求指教)

扩展(后期再总结至解构赋值,es6相关的):对于数组字面值使用...扩展运算符

会转化为 逗号分割的参数序列
...[1,2,3] // 1,2,3 

我们常这样使用
var arr4 = [1,2,3]
console.log(...arr4) // 1,2,3

2.布尔字面量

布尔字面量:true 和 false

如何理解:

  • 不要混淆作为布尔对象的真和假与布尔类型的原始值true和false。布尔对象是原始布尔数据类型的一个包装器。
这是个初始值为false的对象
var f = new Boolean(false) //Boolean{false}
if(f){
    console.log('1')
}else{
    console.log('2')
}
结果会输出 // 1 

其值不是[undefined]或[null]的任何对象(包括其值为false的布尔对象)在传递给条件语句时都将计算为true

3.整数字面量

这个没啥好说直接看例子,这些值便是整数字面量

0, 117 and -345 (十进制, 基数为10)
015, 0001 and -0o77 (八进制, 基数为8)
0x1123, 0x00111 and -0xF1A7 (十六进制, 基数为16"hex")
0b11, 0b0011 and -0b11 (二进制, 基数为2)

4.浮点数字面量

同上

3.14
-.2345789 // -0.23456789
-3.12e+12  // -3.12*10^12
.1e-23    // 0.1*10^(-23)=10^(-24)=1e-24

5.对象字面量

对象字面值:封闭在{}中的0 or 多个 属性-值对(也叫元素)的列表
如=> { 键:值, 元素2, 元素3, }
  • 其中, 属性 也可以随意写,如:aosjdfo均为覅哦
  • 但是, 对于这种不是合法的标识符,就一定要用 "" 包裹,
  • 且, 访问只能用 []

由于语句块也使用{}花括号,你不能在一条语句的开头就使用对象字面值,左花括号 { 会被认为语句块的起始符号

es6后,对象字面量被增强!

  1. 支持创建时设置原型
  2. 属性-值对为同一字符时可简写
  3. 方法简写,支持父方法调用
  4. 使用表达式动态计算属性名
1.__proto__
2.name:name =>name
3.省略functionsuper调用父方法
4.动态属性名,语法:['表达式']

funtion Yuanxing(age) {
    this.age = age
    this.fu = function() {return '调用了父方法'}
}
var Yx = new Yuanxing(18)
var name = '张三'
var obj = {
    __proto__: Yx,
    name, // name:name => name:'张三'
    fangfa() {
        return super.fu() // 返回 '调用了父方法'
    }, // 以前 fangfa: function() {}
    ['active_'+1]:1  属性为=> //active_1
}

需注意: 对象访问属性值,[""]为万能的,

var obj = {name:'zs',2:'two'}
obj["name"] // zs
obj["2"] // 2
而
obj.2 , obj[name] 
前者为不合法的属性名,不能使用`.`,
后者使用[]访问,name并不是其索引,都会出错

6. RegExp 字面值

一个正则表达式是字符被斜线(译注:正斜杠“/”)围成的表达式。如: /ab+c/

7.字符串字面量

字符串字面量是由双引号(")对或单引号(')括起来的零个或多个字符。

"foo"
'bar'
"1234"
"one line \n another line"
"John's cat

???除非有特别需要使用字符串对象,否则,你应当始终使用字符串字面值。

8.模板字面量

模板字面量: `${}`
var name = 'zs'
`${name}` // zs

???在通过模板字符串前添加一个tag来自定义模板字符串的解析过程,这可以用来防止注入攻击,或者用来建立基于字符串的高级数据抽象。