第3章 基本概念

3.1 语法

3.1.1 区分大小写

test和Test表示两个不同的变量

3.1.2 标识符

标识符:指变量,函数,属性的名字或者函数的参数
标识符命名规则:
1.第一个字母必须是一个字母,下划线(_),或一个美元符号$
2.其他字符可以是字母,下划线,美元符号或数字
3.不可以使用关键字作为标识符
4。推荐使用驼峰命名法,比如:changeColor

3.1.3 注释

//单行注释

/*
  *  多行注释
  *
  */

3.1.4 严格模式

ECMAScript5 引入了严格模式概念

在顶部添加代码:'user strict';

3.1.5 语句:

不能省略语句结尾分号原因:

  1. 如果省略,将会由解析器确定语句的结尾,
  2. 加上分号,会避免很多错误(例如不完整的输入)
  3. 代码结尾没有分号,会导致压缩错误;
  4. 提高性能,解析器不用在推测哪里插入分号耗费时间
if (test)
   alert(test)   //有效,但容易出错,不推荐使用
if (test) {
   alert(test)   //推荐使用
}

3.2 关键字和保留字

关键字和保留字都不能作为标识符或者属性

3.3 变量

js中每个变量仅仅是一个用来保存值的占位符而已

3.4 数据类型

3.4.1 typeof操作符

typeof是一个操作符,而不是函数
用来检测基本类型变量的数据类型

 typeof 15 ==> number

3.4.2 Undefined 类型

//声明了未初始化的message,和未声明的age,都返回undefined
var message;

alert(message) ==> "undefined";
alert(age) ==> "undefined";

3.4.3 Null类型

typeof null ==> 'object'  ==> 从逻辑上讲,null表示一个空对象指针,所以会返回object

null 和 undefined 关系:

  1. undefined 派生自null ,所以 null == undefined ==> true;
  2. 无论什么情况下,都没有必要把一个变量的值显式的设置为undefined;
  3. 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值;

3.4.4 Boolean 类型

Boolean类型的字面值true和false是区分大小写的,也就是说True和False都不是Boolean值,只是标识符;

3.4.5 Number类型

八进制字面量在严格模式下是无效的,会导致报错

  1. 浮点数值
    浮点数:该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字
var floatNum = .1 //有效,但不推荐

浮点数存在的问题:

0.1 + 0.2 ==> 0.30000000000000004

解决方案: 使用toFixed() 来保留小数点后几位

这是基于IEEE754数值的浮点计算通病,其他语言也会出现这样的问题

if (a + b == 0.3){      //这样的判断在浮点数下,会导致错误
   alert('you got 0.3')
}
  1. 数值范围:
    Infinity和-Infinity

  2. NaN
    非数值,是一个特殊的数值,用来表示一个本来要返回数值的操作数未返回数值的情况(防止错误)

var aa = 'ww';
0/aa ==> NaN

js中,任何数值除以非数值会返回NaN,因此不会影响代码执行

NaN拥有两个非同寻常的特点:

  1. 任何涉及NaN的操作,都会返回NaN
  2. NaN与任何值都不相等,包括自己;

isNaN() 检测是否是数值有问题:
isNaN('') ==> false

isNaN()把空字符串或空格当作0处理

  1. 数值转换
    有三个函数可以把非数值转换为数值
    Number() ==> 用于任何数据类型
    由于Number在转换字符串时比较复杂而且不够合理,因此在处理整数上常用
parseInt()函数;
parseInt()和parseFloat() ==> 用于把字符串转为数值

parseInt原理:
parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。会忽略字符串前面的空格,直至找到第一个非空字符。如果第一个字符不是
数字或者负号,parseInt()会返回NaN。也就是说,parseInt()转换空字符串会返回NaN,如果第一个是数字字符,parseInt()会继续解析第二个字符,
直到解析完所有后续字符或者遇到一个非数字字符

例如:

parseInt('123blue') ==> 123
parseInt('') ==> NaN
parseInt(22.5) ==> 22

parseInt接收第二个参数,表示转换时使用的基数
parseInt(12,10)  ==> 表示用十进制来解析

不指定基数意味着让parseInt()自己决定如何解析输入的字符串,为了避免错误的解析,建议无论什么情况下都明确指定基数;

parseFloat()和parseInt()区别:

  1. 都是字符串中第一个小数点有效,第二个无效
parseInt('22.34.45') ==》 22
parseFloat('22.34.45')  ==> 22.34

2.parseFloat() 始终会忽略前导的0,且parseFloat()只解析十进制的值

parseFloat('1234blue') ==》 1234
parseFloat('oxA') ==》 0
parseFloat('22.5') ==> 22.5
parseFloat('22.34.5') ==> 22.34
parseFloat('0908.5') ==> 908.5

3.4.6 String类型

1.转义字符:

\n 换行 ==》 'he said, \n'
\' 单引号 ==》 'he said,\'hey.\''
\" 双引号 ==》 'he said,\"hey.\''

2.转换为字符串

toString() ==> var num = 123; num.toString() ==> '123'

toString()问题:null和undefined没有这个方法,调用时会报错

如果不确定需要转换的字符串是不是null和undefined,则建议使用String()
String()详解:

  1. 如果值有toString(),则调用;
  2. 如果值为null,则返回null;
  3. 如果值为undefined,则返回undefined;

3.4.7 Object 类型

Object类型所具有的任何属性和方法也同样存在于更具体的对象中

3.5 操作符

3.5.1 一元操作符

只能操作一个值的操作符叫一元操作符

  1. 递增和递减操作符

前置型:变量的值在语句被求值以前改变

++age  ==  age = age + 1;
--age  ==  age = age - 1;

后置型:递增递减操作是在语句被求值之后才执行

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2 ==> 22;
var num4 = num1 + num2 ==> 21
  1. 一元加和减操作符

一元加操作符

+'01' ==> 1
+'1.1' ==> 1.1
+'z' ==> NaN
+false ==> 0

一元减操作符

-‘01’ ==》 -1
-‘1.1’ ==》 -1.1
-‘z’ ==> NaN
-false ==> -0

3.5.2 布尔操作符

  1. 逻辑非
!{} ==> false
!{name:'wang'} ==> false
  1. 逻辑与
    &&
    逻辑与操作符属于短路操作,如果第一个操作数能决定结果,那么就不会再对第二个操作数求值

  2. 逻辑或
    ||
    逻辑或也是短路操作;

3.5.3 乘性操作符

  1. 乘法
var result = 44 * 45;
  1. 除法
var result = 66 / 11;

3.求模(求余数)

var result = 26 % 5;

3.5.4 加法操作符

  1. 加法
var result = 66 + 1;
  1. 减法
var result = 66 - 1;

3.5.5 关系操作符

< >  <= >=

3.5.6 相等操作符

  1. 相等和不相等
==  !=
null == undefined ==> true
NaN == NaN ==》 true
true == 1 ==> true
true == 2 ==> false
  1. 全等和不全等
    === !==

3.5.7 条件操作符

var flag = this.value ? true : false;

3.5.8 赋值操作符

var num = 10;
num = num + 10;

可转换为:

var num = 10;
num += 10;

类似的还有:

num *= 10  ==  num = num * 10;
num /= 10  ==  num = num / 10;
num %= 10  ==  num = num % 10;
num -= 10  ==  num = num - 10;

3.5.9 逗号操作符

var num,age,name;

3.6 语句

3.6.1 if语句

if( condition ){  // ECMAScript会自动调用Boolean()转换函数将这个表达式结果转换为一个布尔值
   //
}

3.6.2 do-while 语句

后测试循环语句,只有在循环体中代码执行之后,才会测试出口条件

var i = 0;
do {
   i += 2
} while ( i < 10 );

3.6.3 while 语句

前测试循环语句,在循环体内代码被执行之前,就会对出口条件求值;

var i = 0;
while( i < 10 ){
    i += 2;
}

3.6.4 for语句

前测试循环语句

for(;;){   //无限循环,会导致浏览器崩溃,可以试试;
   console.log(11)
}

3.6.5 for in 语句

用来枚举对象的属性
如果要迭代的对象是null, undefined,则会终止循环
所以在使用for in之前,要确保该对象不是null或undefined

3.6.6 break 和 continue 语句

break: 立即退出循环,强制继续执行循环后的语句;
continue: 立即退出循环,从循环的顶部继续执行;

3.6.7 with语句

with语句作用主要是将代码的作用域设置到一个特定的对象中,定义with语句主要是为了简化多次编写同一个对象的工作;

var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;

使用with语句改写:

with(location){
    var qs = search.substring(1);
    var hostName = hostname;
    var url = href;
}

缺点:严格模式下不允许使用with语句,否则将会视为语法错误

一般情况下,作用域链只会被with和catch语句影响。当使创建用with的时候,函数会创建一个新的活动对象,推到最前端,该对象就是with的对象。这就意味着所有的局部变量都处于第二个作用域链对象中去了,这也就是为什么要避免使用with的原因。
由于大量使用with语句会导致性能下降,同时也会造成调试代码困难,因此不建议使用with

3.6.8 switch语句

省略break关键字,会导致执行完当前case后,继续执行下一个case

3.7 函数

3.7.1 理解参数

ECMAScript不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。
在函数体内,可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数

获取函数的参数数量:arguments.length;

function nums(num1,num2) {
    console.log(arguments)
}
nums(1,2,3)

可以看到打印结果:

image.png

3.7.2 没有重载

其他语言(Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可,ECMAScript函数没有签名,
因为其参数是由包含零或多个值的数组来表示的,而没有函数签名,真正的重载是不可能做到的;

如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数;

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

推荐阅读更多精彩内容

  • 本章内容 语法 数据类型 流控制语句 理解函数 3.1 语法 3.1.1 区分大小写 区分大小写 3.1.2 标识...
    闷油瓶小张阅读 710评论 0 0
  • 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script...
    oWSQo阅读 1,785评论 0 1
  • 夜晚又一次失恋了 月亮难过地扭过脸去 星星开始低声呜咽 柳叶含着泪悲鸣 花儿垂头丧气 萤火虫也早早睡了 湖水有一声...
    上官飞鸿阅读 243评论 0 13
  • 熊猫双鱼图~ 纸本水墨~
    小微绘话阅读 379评论 11 2
  • 时间是这个世界上最公正无私的东西之一,你怎么打发时间,时间就这么打发你,且没有商量的余地。 一个人十年八年后的光景...
    大張冰阅读 126评论 0 4