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

一、语法

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()方法的返回值相同。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容