JS言语中心——“词法构造及范例、值和变量”

1 词法组织

1.1 字符集

  • 字符集:JS顺序是用Unicode字符集编写的

1.2 解释

  • js支撑两种花样的解释

// 单行解释

/* 另一个解释 */ //也是一个解释

/*
  • 这是一个

  • 多行解释
    */

1.3 直接量

  • 直接量literal:顺序中直接运用的数据值

12 //number
true //boolean
"hello" //string
1.2 //float
[1, 2, 3] //array
var obj = {
    name: "Oli",
    age: 18
}; //object

1.4 标识符和保留字

  • 标识符:就是一个名字,用来对变量和函数定名,或许用作JavaScript代码中某些轮回语句中的跳转位置的标记

  • 保留字:JavaScript把一些标识符拿出来用作本身的关键字

2 范例、值和变量

  • 数据范例type:能够示意并操纵的值的范例叫做数据范例(type)

  • 可具有要领的范例

  • 不可具有要领的范例

  • 可变范例:可修改的,如对象和数组

  • 不可变范例:不可修改的,如数字、布尔值、null和undefined

  • 变量variable:变量是一个值的标记称号,能够经由过程称号取得对值的援用

    • 全局变量global variable:不在任何函数内声明的变量称为全局变量

  • 数据范例

    • 原始范例(Primitive type)

      • 数字

      • 字符串

      • 布尔值

      • null(空)

      • undefined(未定义)

    • 对象范例(object type)

      • 对象object:对象 (object)是属性(property)的鸠合,每一个属性都由”名/值对”构成。

        • 无序鸠合:一般的javascript对象是“定名值”的不必鸠合

        • 有序鸠合:数组array,示意带编号的值的有序鸠合

        • 函数function:是具有与它想关联的可实行代码的对象,经由过程挪用函数来运转科实行代码,并返还运算效果

          • 组织函数constructor:假如函数初始化(运用new运算符)一个新建对象,我们称之为组织函数

          • 类class:组织函数初始化对象构成的鸠合

            • 数组array类

            • 函数function类

            • 日期date类

            • 正则regexp类

            • 毛病error类

2.1 数字

  • 数字直接量(numeric literal):当一个数字直接出现在javascript顺序中,我们陈之为数字直接量

2.1.1 整型直接量

因为某些javascript的完成支撑八进制的直接量,而有些不支撑,因而最好不要运用以0为前缀的整数直接量。在ECMAScript6的严厉形式下,八进制的直接量是明令禁止的。

2.1.2 浮点型直接量

语法:[digits][.digits][(E|e)[(+|-)]digits]

3.14
0.14
3.14e12
0.14E-21

2.1.3 算术运算

javascript中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。

  • 溢出overflow:数字运算效果超过了javascript中所能示意的数字上线

  • 下溢underflow:当运算效果无线接近于零并比 javascript能示意的最小值还小

全局变量Infinaty和NaN在ECMAScipt3中,这两个值是能够读写的。ECMAScript5修改了这个题目,将他们定义为只读的

  • isNaN():参数是NaN或许是一个非数字值(比方字符串和对象),则返回true

  • isFinite():参数不是NaN、Infinty或-Infinity的时刻返回true

2.1.4 二进制浮点数和四舍五入毛病

javascript中运用实数的时刻,经常只是实在值的一个近似的示意

金融盘算时,要运用整数“分”,而不要运用小数“元”举行基于钱银单元的运算

3.1.5 日期和时候

  • Date()组织函数

2.2 文本

  • 字符串(string):是一组16位值构成的不可变的有序序列,每一个字符一般来自于Unicode字符集

javascript采纳UTF-16编码的Unicode字符集

最经常使用的Unicode字符都是经由过程16位的内码示意,并代表字符串中的单个字符;不能示意为16位的Unicode字符则遵照UTF-16编码划定规矩——用两个16位值构成一个序列(亦称为“代办项对”)示意。这意味着一个长度为2的javascript字符串(两个16位值)能够示意一个Unicode字符

2.2.1 字符串直接量

ECMAScript 3中字符串直接量必需写在一行;

ECMAScript 5中能够拆分成数行,每行必需以\完毕

假如想另起一行,则须要用转义字符\n

    var x = "hello moto! \
goodby nokia!";
    console.log(x); //hello moto! goodby nokia!
    var y = "hello moto! \ngoodby nokia!";
    console.log(y); 
    //hello moto! 
    //goodby nokia!

2.2.2 转义字符

两个转义字符的通用版本:

  • \xXX:十六进制数示意Latin-1

  • \uXXXX:\u示意Unicode中的恣意字码

var x = "\xA9";
console.log(x); //© A9为16进制数,示意Latin-1中的字码
var y = "hello \u000A there";
console.log(y); //示意换行符,个中\u示意4个十六进制数指定的恣意Unicode字符
var z = "hello \n there";
console.log(z); //也能够用\n示意换行符

能够在这里检察Unicode字符集Unicode字符百科;

2.2.3 字符串的运用

ECMAScript 5中,字符串能够当作只读数组,用方括号语法来访问单个字符

2.2.4 婚配形式

JavaScript采纳Perl中的正则表达式语法

2.3 布尔值

  • 布尔值boolean:指代真假、开关、是不是,即保留字true和false

  • 假值(falsy value):false以及能够被转换成false的值;

  • 真值(truthy value):true以及能够被转换成true的值;

2.4 null和undefined

  • null空值:能够示意数字、字符串和对象是“无值”的

  • undefined空白:表明变量没有初始化

ECMAScript 3:undefined是可读写的变量;

ECMAScript 5:undefined则是只读的;

2.5 全局对象

全局对象的初始属性并非保留字,但它们应当当作保留字来看待

//代码的最顶级可用this来援用全局对象
var str = "Hello World";
var global = this;
console.log(global.str);
console.log(str);
console.log(this.str);
//上面三中写法都是一样的

2.6 包装对象

字符串、数字等的属性都是只读的,且不能给他们定义心属性;

当视图给他们定义属性或修改属性时,修改只发生在暂时对象身上;

var s = "str";
s.len = 4;
console.log(s.len); //undefined 暂时对象的修改,随即被“烧毁”

JavaScript会在必要时将包装对象转换成原始值:

var a = "test";
var b = 1;
var c = true;
var A = new String(a);
var B = new Number(b);
var C = new Boolean(c);
console.log(A); //String对象
console.log(B); //Number对象
console.log(C); //Boolean对象
console.log(a == A); //true
console.log(a === A); //false
console.log(typeof a); //string
console.log(typeof A); //object

2.7 不可变的原始值和可变的对象援用

JavaScript中原始值(undefined、null、布尔值、数字和字符串)与对象(对象、数组、函数)差别;前者是不可变的,后者才可变;

如字符串修改后似乎修改了本来的值,实际上是创建了新的字符串:

var s = "string";
s.toUpperCase();
console.log(s); //string原始值没有变化

对象则是可变的:

var obj = {
    name: "oliver",
    age: 18
};
obj.name = "alice";
console.log(obj.name) //alice

字符串的比较只需每一个索引上的值都相称且长度相称就是相称,而对象包括的属性及值都雷同,但也是不相称的:

var s = "string";
var S = "string";
console.log(s === S); //True
var obj = {
    name: "oli"
};
var OBJ = {
    name: "oli"
};
console.log(obj === OBJ); //False
var a = [1,2];
var A = [1,2];
console.log(a === A); //False
  • 对象就是援用范例(reference type);

  • 对象值就是援用;

  • 对象的比较就是援用的比较,当且仅当它们援用同一个基对象时,他们才相称:

var a = [];
var b = a;
b[0] = 1;
console.log(a[0]); //1 致使援用的数组也被修改
console.log(a === b); //True

怎样复制数组呢:

var a = [1,2,3];
var b = [];
for (var i = 0; i < a.length; i++) {
    b[i] = a[i];
};
console.log(b.toString()); //1,2,3

//或许用concat要领
var a = [1,2,3];
var b = a.concat();
b[0] = 0;
console.log(b.toString());
console.log(a.toString());

比较两个数组:

// var a = [1, 2, 3];
// var b = a.concat();
function compareArray(a, b) {
    if (a.length !== b.length) {
        return false;
    }
    for (var i = 0; i < a.length; i++) {
        if (a[i] !== b[i]) {
            return false;
        }
    };
    return true;
}
// console.log(compareArray(a, b)); //True

2.8 范例转换

2.8.1 转换和相称性

  • ==:即是运算符

  • ===:恒等运算符

2.8.2 显式范例转换

为了使得代码可读性加强,须要用到显式转换(Number()String()等)

数字转换成字符串

Number类定义的toString()要领能够吸收示意转换基数(radix)的可选参数:

var x = 12315;
console.log(x.toString(16)); //301b

数字转换成浮点型或整型

  • toFixed():依据小数点后的指定位数将数字转换为字符串,不运用指数计数法;

  • toExponential():运用指数计数法

  • toPrecision():依据指定的有用数字位数将数字转换成字符串

var n = 123456.789;
console.log(n.toFixed(0)); //1234567
console.log(n.toFixed(2)); //123456.79
console.log(n.toFixed(5)); //123456.78900
console.log(n.toExponential(1)); //1.2e+5 
console.log(n.toExponential(3)); //1.235e+5 
console.log(n.toExponential(10)); //1.2345678900e+5 
console.log(n.toPrecision(4)); //1.235e+5 
console.log(n.toPrecision(8)); //123456.79 
console.log(n.toPrecision(10)); //123456.7890 

字符串转换成数字

  • parseInt():剖析整数

  • parseFloat():剖析整数和浮点数,吸收第二个参数为基数

var s = "3.14 pi";
console.log(parseInt(s)); //3
console.log(parseFloat(s)); //3.14
var S = "0.123 hello";
console.log(parseInt(S)); //0
console.log(parseFloat(S)); //0.123
var x = ".12 good";
console.log(parseInt(x)); //NaN
console.log(parseFloat(x)); //0.12
var X = "$0.123 hello";
console.log(parseInt(X)); //NaN
console.log(parseFloat(X)); //NaN

2.8.3 对象转换成原始值

  • toString()

  • valueOf()

2.9 变量声明

ECMAScript 5严厉形式下假如给一个没有声明的变量赋值会报错:

"use strict";
x = 10; //报错

2.10 变量作用域

  • 变量作用域(scope)是顺序源代码中定义这个变量的地区

2.10.1 函数作用域和声明提拔(提早)

  • 块级作用域(block scope)

  • 声明提早(hoisting):函数里声明的一切变量(不触及赋值)都被“提早”至函数体的顶部:

//函数内部的局部变量遮盖了同名的全局变量,在实行到var的时刻才会真正的被赋值
var scope = "global";
function fc () {
    console.log(scope); //undefined
    var scope = "local";
    console.log(scope); //local
}
fc();
//此处没有同名的局部变量,所以输出全局变量的值global
var scope = "global";
function fc () {
    console.log(scope); //global
}
fc();

准确的誊写体式格局:

//上述代码应当写成:
var scope = "global";
function fc () {
    var scope;
    console.log(scope); //undefined
    scope = "local";
    console.log(scope); //local
}
fc();

先声明再赋值或运用

2.10.2 作为属性的变量

运用var声明一个变量是不可设置的(不可用delete)

"use strict"
var x = 10;
this.y = 10;
delete this.y;
delete x; //报错
    原文作者:JS菌
    原文地址: https://segmentfault.com/a/1190000004679778
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞