JavaScript基本概念(语法、关键字、变量、数据类型)

包含语法、操作符、数据类型、内置功能
适用ECMAScript 3

语法

大小写敏感(一切名字都敏感,包括不限于变量名,函数名,操作符名等)

标识符

由字母(包含扩展ASCII字母和Unicode字母),数字,下划线,美元符号组合组成
规则1:第一个字符不能是数字
规则2:不能用保留字和关键词

驼峰命名法是最佳实践

注释

C风格注释

//单行注释
/*
 * 多行注释
 */
严格模式

ES5中引入 严格模式
在脚本首行加入

"use strict";

其实是条编译器指令(pragma)
也可在函数中单独使用

function doSomething(){
    "use strict";
}
语句

加不加分号都行,但是需要让解释器能够确定语句结束(比如换行)
但是最好加上分号,比如压缩代码时,调试时等

可以使用{}把多条语句组合成代码块,在if,while等中最好用{}扩住,以防止不必要的错误

关键字和保留字

abstract
boolean break byte
case catch char class const continue
debugger default delete do double
else enum export extends
false final finally float for function
if implements import in instanceof int interface
long
native new null
package private protected public
short static super switch synchronized
this throw throws transient true try typeof
var void volatile
while with

了解即可

变量

JavaScript是类型松散型,一个变量名可以表示多种变量类型,比方说 鸭蛋儿 这个名字,既可以表示吃的鸭蛋,也可以表示人

如何定义一个变量:

var message;

定义个名字为message的变量,在没有值之前,message有特殊值——undefined,表示值不明确

变量初始化:

var message = "空尼奇瓦";

并不会把message的类型限定为string,只是此时为string,还可以赋值为别的类型

message = 100

可以这么做,但是不推荐

作用域问题
function test(){
  var message = "hi";
}

message作用域在函数test中
超出作用域访问会报错

test();
alert(message);//报错 Uncaught ReferenceError: a is not defined

省略var即可创造全局变量

function test(){
  message = "hi";
}
test();
alert(message);

注意点:test函数被调用message才会声明,只写message不给值,报错
不推荐使用

联合声明
var message = "hi",
    found = false,
    age = 29;

写成多行便于阅读,非必须

数据类型

ECMAScript中有6种数据类型,简单类型(也称基本)有5种:undefinednullbooleannumberstring,复合数据类型有1种:object

typeof

返回变量的类型,typeof是操作符,不是函数
6种可能值undefined boolean number string object function,为毛没有null类型,反而多一个 function类型,nullfunction其实都是 object 类型,但是null没有特殊返回一种类型,function特殊返回function,并没有返回object,注意,之前各浏览器实现不同

undefined

undefined类型只有一个值undefined。在声明了一个变量,但是没有赋值时,为undefined

var message;//undefined
age;//Uncaught ReferenceError: age is not defined

注意区别

var message;//undefined
alert(typeof message + typeof age);

执行typeof,都返回undefined,这就尴尬了,书上说,这合理,我们要做的是,为每个已经声明的变量显式赋值,这样返回undefined时,我们就能知道这个值是未声明过了,因为已经声明赋值过的变量不会返回undefined

null类型

null类型有一个值null,表示空对象指针,但是typeof null返回object,合理
最好把一个将来用作对象类型的变量初始化为null,因为这样我们就可以用if(xxx != null)来判断对象有没有值,假如不怎么做,还有一个undefined
undefined派生自null

所以

null == undefined//为true
boolean类型

boolean有两个值 truefalse
所有类型的值都可以转化为boolean类型,使用Boolean()函数
返回false的有,""(空串),0NaNnullundefined
其他返回true
在控制流语句中会自动转换

number类型

包含整数和浮点数(双精度)

整数

默认为十进制

var intNum = 10;//整数10进制10

整数还有8进制和16进制表示法,8进制前缀为0,16进制前缀为0x或则0X,另外在8进制表示法中出现0-7之外的数字,8进制会被当做10进制解析

var a = 10 //10进制的10
var b = 010 //8进制的8
var c = 0x10 //16进制的16
var d = 08 // 会被当做 10进制的8,因为超出了0-7

8进制字面量在严格模式下无效
在进行算术计算时,结果都为10进制
JavaScript可以保存+0-0,二者相等

浮点数

带有小数点,并且小数点后至少必须有一位不为0的数字

var a = 1.1;//浮点数1.1
var b = 0.1;//浮点数0.1
var c = .1;//浮点数0.1,这种写法不推荐

浮点数内存是整数两倍,所以为了节省空间,JavaScript会把可以当做整数的数当做整数

var a = 0.0 //整数0
var b = 1.0 //整数1

对于极大和极小值,JavaScript使用科学计数法

var a = 3.14e7 // 3.14乘以10的7次方
var b = 3.14e-7 // 3.14乘以10的-7次方

ECMAScript会把小数点后面带有6个0以上的浮点数转换为e表示法,如0.0000003会被转换成3e-7
浮点数最高精度为17位小数(有效数字,从左起第一个不为0的数算起到末尾的个数),用浮点数做运算和比较操作是不准确的,这属于浮点数在计算机中的表示法决定的

数值范围

ECMAScript能够表示的最大数值为Number.MAX_VALUE(1.7976931348623157e+308),最小数值为Number.MIN_VALUE(5e-324),如果超出这两个范围,会被转换成Infinity(正无穷),或-Infinity(负无穷),正负无穷无法参与计算,isFinite()可以判断是不是有穷,另外,正负无穷被保存在Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY

NaN

非数值(Not a Number)是个特殊的数值,数值/0 就会得到NaN,这个值有两个特点
1、与任何值计算都会返回NaN
2、与任何值都不相等,包括自身
函数isNaN()来判断是不是NaN,该函数接受一个参数,参数可以是任何类型

isNaN(NaN);//true
isNaN(10);//false 10
isNaN("10");//false 10
isNaN("blue");//true
isNaN(true);//false 1
isNaN('true');//true
数值转换

三个函数 Number()parseInt()parseFloat()
Number()把可用于任意类型,parseInt()parseInt()专门用于字符串
Number()函数装换规则:

  • truefalse对应1和0
  • 数字输出数字
  • null0
  • undefined返回NaN
  • 字符串
    只包含数字转换为十进制
'1';//1
'123';//123
'011';//前缀0被忽略,11,就8进制不行
'1.1'//1.1
'0xf';//16进制形式,为10进制15
'';//空字符串为0

除了以上格式,皆为NaN

  • 对对象使用Number()函数
    调用对象的valueOf()方法,依照前述规则进行转换返回的值,如果转换结果为NaN,则调用对象toString(),然后依照字符串转换规则转换

Number()函数过于复杂,一般使用parseInt()函数
规则:
忽略字符串前面的空格,直到第一个非空字符,如果这个非空字符不是数字或者正负号,返回NaN,所以parseInt()转换空字符串返回NaN,如果第一个非空字符是正负号或者数字,继续解析以后字符,直到遇见非数字字符,1234blue123422.522,因为小数点不是数字字符
如果字符串中的第一个非空字符是数字字符或者正负号,parseInt()也可以识别出各种进制

' 1234ddd';//1234
'';//NaN
'0xA';//10
'010';//8
'22.5';//22

注意,在ES5中,parseInt()不能解析8进制(为毛老是8进制),有前缀0的会被解析成10进制
parseInt()的第二个参数可以指定解析的进制,如parseInt("0xAF",16),解析为175
一般我们都指定进制
parsefloat()parseInt()基本类似,不同在于

parsefloat('2.1.1');//为2.1
parseInt('2.1.1');//为2

parsefloat()会忽略前缀0,可以转成整数就返回整数,如'1.0',16进制格式始终返回0,parsefloat()只解析10进制

'1234kkk';//1234
'0xA';//0
'22.6';//22.6
'22.2.2';//22.2
'0099.09';//99.09
'3.125e7';//31250000

string类型

由0到多位Unicode字符组成的字符序列,即字符串。由""或者''包裹,两者意义相同,配对即可。

字符字面量

特殊字面量,转义序列,用于表示非打印字符或者有特殊用途的字符

\n;//换行
\t;//制表
\b;//空格
\r;//回车
\xnn;nn为16进制,\x41表示A
\unnnn;nnnn为16进制,表示一个Unicode字符,\u03a3

后两种表示法也可以放在字符串中

var text = 'this is a pen apple pen \u03a3';

length可以获得字符串中16位字符(哪个大神解释下?16位不就是双字节吗)的数目,如果字符串中包含双字节字符,不精确,一个汉字占用两个长度,但是两字汉字一起却占用三个长度。

字符串特点

字符串不可变,只能用新的字符串覆盖原来的变量名

var str = "Hello";
str = str + " World"//Hello World
转换成字符串

几乎每个值都有toString()方法,nullundefined没有

var a = true;
a.toString();//‘true’
var b = 11;
b.toString();//'11'

数值型调用toString()方法时,可以指定进制

var num = 10;
num.toString();//10
num.toString(2);//1010
num.toString(8);//12

因为nullundefined没有toString()方法,不小心调用会报错,我们可以使用String()函数,任意数值都可以转换,转换规则如下:

  • 值有toString方法,调用返回
  • 值是null返回'null'
  • 值是undefined返回'undefined'
    使用加号+操作符,和字符串一起,值就会调用String()

object类型

一组数据和功能的集合,通过new创建

var o = new Object();//没有参数时,可以省略(),不推荐

Object类型是所有实例的基础
每个Object类型都有:

  • Constructor:保存着用于创建当前对象的函数,比如Object()
  • hasOwnProperty(propertyName)propertyName必须为字符串,检查在当前实例中是否存在相应的属性名
  • isPrototypeOf(object):检查传入的对象是否是另一个对象的原型(到底谁是谁的原型)
  • propertyIsEnumerable(propertyName):属性是否可遍历
  • toLocaleString():返回与执行环境地区对应的字符串
  • toString():字符串表示
  • valueOf():返回对象的字符串,数值或者布尔值表示,对象->值

注意:浏览器环境中的对象,比如BOM或者DOM中的对象,属于宿主对象,不一定会继承Object

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

推荐阅读更多精彩内容