美文网首页
1、基本概念(1)(JS高级笔记)

1、基本概念(1)(JS高级笔记)

作者: yjaal | 来源:发表于2017-03-11 21:34 被阅读40次

一、语法

1.1 区分大小写

JS中一切(变量、函数名和操作符)都是区分大小写的。

1.2 标识符

标识符可以是按照下列格式规则组合起来的一个或多个字符:

  • 第一个字符必须是一个字母、下划线或一个美元符号
  • 其他字符可以是字母、下划线、美元符号或数字。

二、变量

定义变量时要使用var操作符:

var message;

这里定义了一个变量,该变量可以保存任何值(像这样未经过初始化的变量,会保存一个特殊的值——undefined),在定义的时候如果不使用var操作符,那么定义的新变量将是全局变量。

三、数据类型

ECMAScript中有五种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、NumberString。还有一种复杂的数据类型——Object,其本质上是由一组无序的名值对组成的。

3.1 typeof操作符

这里typeof是用于检测数据类型,对一个值使用typeof操作符可能返回下列某个字符串:

  • undefined”——如果这个值未定义
  • boolean”——如果这个值是布尔值
  • string”——如果这个值是字符串
  • number”——如果这个值是数值
  • object”——如果这个值是对象或null
  • function”——如果这个值是函数

3.2 Undefined类型

Undefined类型只有一个值,即特殊的 undefined,使用var声明变量但未对其加以初始化时,这个变量的值就是undefined

包含undefined值的变量与尚未定义的变量是不一样的:

var message;
//下面这个变量并没有声明
//var age;

console.log(message);//undefined
console.log(age);//产生错误

注意:对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样会返回undefined值。

3.3 Null类型

Null类型是第二个只有一个值的数据类型,这个特殊的值就是null。使用typeof操作符检测null会返回“object”。如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,而不是其他值。这样,只要检查null值就可以知道相应的变量是否已经保存了一个对象的引用。

if(car != null){
  //对car对象执行某些操作
}

实际上,undefined值是派生自null值的,所以它们是相等的:

alert(null == undefined);//true

3.4 Boolean类型

该类型有两个字面值:truefalse(不等同于1、0)。虽然此类型的字面值只有两个,但ECMAScript中所有类型的值都有与这两个值等价的值,要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()

var message = "Hello";
var messageAsBoolean = Boolean(message);

下表给出了各种数据类型及其对应的转换规则:

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值 0NaN
Object 任何对象 null
Undefined 不适用 undefined

这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转换非常重要:

var message = "Hello";
if(message){//自动转型
  alert("Value if true");
}

3.5 Number类型

var intNum = 10;//整数

var octalNum1 = 070;//八进制的56
var octalNum2 = 079;//无效八进制——解析为79
var octalNum3 = 08;//无效八进制——解析为8

var hexNum1 = 0xA;//十六进制的10
var hexNum2 = 0x1f;//十六进制的31

3.5.1浮点值

所谓浮点值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但不推荐这种写法。

var floatNum1 = 1.1;
var floatNum2 = 01;
var floatNum3 = .1;//不推荐

由于保存浮点值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点值转换为整数值:

var floatNum1 = 1.;//小数点后面没有数字——解析为1
var floatNum2 = 10.0;//整数——解析为10

浮点值的最高精度是17位小数,但在进行算术时其精度远远不如整数,如0.10.2的结果不是0.3,而是0.30000000004

if(a + b == 0.3){
  //不要这样做
}

3.5.2 数值范围

由于内存限制,ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,能表示的最大值保存在Number.MAX_VALUE中。如果某次计算的结果得到了一个超出JS数值范围的值,那么这个数值将被自动转成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),否则将被转换成Infinity(正无穷)。

如果某个值是Infinity(正或负),那么该值将无法继续参与下一次计算。可以使用isFinite()函数来判断某个值是否是有穷的(如果是有穷则返回true)。访问Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY也可以得到负和正Infinity的值。

3.5.3 NaN

  • 这个值是一个非数值,是一个特殊的数值,这个数值用于一个本来要返回数值的操作数未返回数值的情况。零除以零返回NaN,整数除以零返回Infinity,负数除以零返回-Infinity

  • NaN本身有两个特点:首先,任何涉及NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。这里可以使用isNaN()函数帮助我们确定这个参数是否“不是数值”。此函数在接收到一个数值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,如字符串或布尔值。而任何不能被转换为数值的值都会导致这个函数返回true

alert(isNaN(NaN));//true
alert(isNaN(10));//false(10是一个数值)
alert(isNaN("10"));//false(可以被转换成10)
alert(isNaN("blue"));//true(不能转换成数值)
alert(isNaN(true));//false(可以被转换成1)
alert(isNaN(false));//false(可以被转换成0)

说明:此方法确实也适用于对象,在后面进行说明。

3.5.4 数值转换

有三个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。第一个函数,即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。三个函数对于同样的输入会有不同的结果。

1、Number()函数的转换规则

  • 如果是Boolean值,truefalse分别被转换为10
  • 如果是数字值,只是简单的传入和返回
  • 如果是null值,返回0
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循下列规则
    • 如果字符串中只包含数字(包括带正号或负号的情况),则将其转换为十进制数值。如“123”转换为123“011”转换为11(前导零被忽略)
    • 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点值(也会忽略前导零)
    • 如果字符串中包含有效的十六进制格式,如“0xf”,则将其转换为相同大小的十进制整数值
    • 如果字符串是空的(不包含任何字符),则将其转换为零
    • 如果字符串中包含除上述格式之外的字符,转换为NaN
  • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString(),然后再次依照前面的规则转换返回的字符串值。

2、parseInt()函数的转换规则
由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt()函数。此函数在处理字符串时,会忽略字符串前面的空格,直至找到一个非空字符。如果第一个字符不是数字字符或负号,此函数会返回NaN。也就是说,此函数转换空字符串会返回NaNNumber()对空字符返回零)。如果第一个字符是数字字符,此函数会继续解析第二个字符,直到解析完所有的后续字符或者遇到了一个非数字字符。如“123blue”会被转换为123“22.5”、“22.1”都会被转换为22。如果字符串中第一个字符是数字字符,此函数能够是被出各种整数的格式。

var num1 = parseInt("123blue");//123
var num2 = parseInt("");//NaN
var num3 = parseInt("0xA");//10
var num4 = parseInt("22.5");//22
var num5 = parseInt("070");//56
var num6 = parseInt("70");//70

说明:ECMAScript 53中此函数对八进制的解析存在分歧:

var num7 = parseInt("070");//ECMAScript 3认为是56,ECMAScript 5认为是70

也就是说,ECMAScript 5中,此函数已经不具有解析八进制的能力。针对这种情况,我们推荐指定基数,即指定使用哪种格式(进制)解析:

var num1 = parseInt("AF", 16);//175
var num2 = parseInt("AF");//NaN

3、parseFloat()函数的解析规则
parseInt()函数类似,此函数也是从第一个字符开始解析每个字符。也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。字符串中的第一个小数点是有效的,而后面多余的小数点就是无效的了,于是,后面的字符串将被忽略。如“22.5.6”将被转换为22.5。除了第一个小数点有效之外,此函数与parseInt()的第二个区别在于它始终都会忽略前导的零。此函数可以识别前面讨论过的所有的浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串则始终会被转换为零。由于此函数值解析十进制值,因此它没有第二个参数用来指定基数的用法。如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),此函数会返回整数。

var num1 = parseFloat("123blue");//123
var num2 = parseFloat("0xA");//0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.5.3");//22.5
var num5 = parseFloat("0908.5");//908.5
var num6 = parseFloat("3.125e7");//31250000

3.6 String类型

字符串可以由双引号或单引号表示,但是左右引号必须匹配。

3.6.1 字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。

字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\\ \\ 斜杠
\' 单引号
\" 双引号
\xnn 以十六进制代码nn表示的一个字符(其中n0~F)。例如\x41表示“A”
\unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n0~F)。如\u03a3表示希腊字符Σ

这些字面量可以出现在字符串中的任意位置,而且被当作一个字符来解析。

3.6.2 字符串的特点

ECMAScript中,字符串是不可变的,即字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后用另一个包含新值的字符串填充该变量。

var lang = "Java";
lang = lang + "Script";

说明:上述代码的执行过程是,首先创建一个能容纳十个字符的新字符串,然后在这个字符串中填充“Java”“Script”,最后异步是销毁原来的字符串“Java”“Script”,因为这两个字符串已经没用了,这个过程是在后台发生的,这也是旧版本浏览器中拼接字符串很慢的原因,现在已经解决了。

3.6.3 转换为字符串

要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。

var age = 11;
var ageAsString = age.toString();//"11"
var found = true;
var foundAsString = found.toString();//"true"

数值、布尔值、对象和字符串值(字符串使用此方法返回其本身的一个副本)都有toString()nullundefined值没有这个方法。在多数情况下,调用此方法不用传递参数,但是在将数字转换为字符串时,可以传入相关的基数,而输出的字符串可以是某个值的八进制、十进制(默认)、十六进制表示。

在不知道要转换的值是不是nullundefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串,转换规则如下:

  • 如果值有toString()方法,则调用该方法并返回相应的结果
  • 如果值是null,则返回“null”
  • 如果值是undefined,则返回“undefined”

3.7 Object类型

ECMAScript中,Object类型是所有它的实例的基础。Object的每个实例都有下列属性和方法:

  • constructor:保存用于创建当前对象的函数。
  • hasOwnProperty(protoName):用于检查给定的属性在当前对象中(而不是在原型中)是否存在,其中参数必须以字符串形式指定
  • isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。参数也必须以字符串形式指定。
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

相关文章

  • 1、基本概念(1)(JS高级笔记)

    一、语法 1.1 区分大小写 在JS中一切(变量、函数名和操作符)都是区分大小写的。 1.2 标识符 标识符可以是...

  • 1、基本概念(2)(JS高级笔记)

    四、操作符 4.1 一元操作符 4.1.1 递增和递减操作符 一元操作符即递增(++)和递减(--)(而各自有两个...

  • 1、基本概念(3)(JS高级笔记)

    4.5 加性操作符 4.5.1 加法 如果两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果: 如果...

  • 校本化HTTP-原生js

    这个笔记是我学习js犀牛书和一个师姐的慕课网学习笔记和js高级编程三个东西的总结 1,基本概念 超文本传输协议(H...

  • js高级笔记

    js高级笔记

  • JS - 高级技巧(1)

    安全数据类型监测 typeof : 由于一些无法预知的情况, 用这种方式会得到不靠谱的结果。instanceof ...

  • js高级程序设计笔记1

    数据类型 1.undefined2.null3.number4.boolean5.string6.object 判...

  • js高级程序设计笔记1

    引用类型 一、object类型 var person = {name : "Nicholas",age : 29}...

  • 3、引用类型(1)(《JS高级》笔记)

    一、Object类型 到目前为止,我们看到的大多数引用类型值都是Object类型的实例。创建Object实例的方式...

  • 023 JS高级

    JS高级 一、函数高级 1、函数回调 2、闭包 二、循环绑定 三、面向对象JS 1、属性与方法 2、类字典结构使用...

网友评论

      本文标题:1、基本概念(1)(JS高级笔记)

      本文链接:https://www.haomeiwen.com/subject/xduzgttx.html