数据类型:原始类型|对象类型 概念:能够表示并操作的值的类型称之为数据类型;变量是一个值得符号名称;
原始类型:
数字,字符串,布尔值,null(空),undefined(未定义)
对象类型:真值
对象(属性的集合)->特殊对象:全局对象,数组类,函数类,日期类,正则类,错误类 /*类相当于对象类型的子类型*/
->普通对象:"命名值"的无序集合
原始值和对象之间的区别:
1.原始值是不可更改的;对象的属性,方法都是可更改的。
2.原始值的比较是值得比较;对象的比较并非值得比较,换句话说,哪怕是两个一模一样的人,他们也只能称之为双胞胎,而不是一个人。
内存管理:js解释器有自己的内存管理机制,所以不用考虑内存的回收问题。
面向对象:数据类型本身可以定义方法来使用值。如:数组a对其元素进行排序,只需:a.sort()即可。/*原始类型除null和undefined都是有方法的值*/
变量:无类型,可以被赋予任何类型,也可以重新被赋予任何类型。关键字 var
作用域:全局和局部变量
数字:js所有数字均用浮点数值表示(64位浮点格式);数组索引是基于32位整数
数字直接量:当一个数字直接出现在js程序中时,我们称之为数字直接量,对应的有整型直接量以及浮点型直接量
整型直接量:十进制整数(0~10),十六进制值(以"0x"或"0X"为前缀,如0xff),八进制部分支持(以"0"为前缀),但是不建议使用
浮点型直接量:3.14, .333, 6.02e23, 1.47E-32
Math:
Math.sqrt()
Math.pow(x,y);x的y次幂,如果y是1/3 则变成了x的立方根
Math.round(x);x的四舍五入(对浮点型)
Math.ceil(x);向上求整(大于等于)
Math.floor(x);向下求整(小于等于)
Math.abs(x);x的绝对值
Math.max(a,b,c);返回最大值,对应min返回最小值
Math.random();生成一个大于等于0小于1.0的伪随机数。/*非常常用的一个函数*/
Math.PI;圆周率
Math.E;自然对数的底数
Math.sin(0),另外还有cos,atan等三角函数
Math.log(10);10 的自然对数
Math.log(100)/Math.LN10;以10为底100的对数
Math.log(512)/Math.LN2;以2为底521的对数
Math.exp(3);e的三次幂
算术运算错误:
溢出:Infinity(无穷大),-Infinity(无穷小)
下溢:当运算结果无限接近于零并比Javascript能表示的最小值还小的时候发生的一种情形。"零"或者"负零" /*负零和正零值是相等的,只有在做为除数时不一样。*/
被除零:Infinity(无穷大),-Infinity(无穷小),0/0返回NaN(not-a-number) /*这里的NaN甚至和自己都不相等,所以isNaN()里面是通过x!=x来判断的*/
二进制浮点数和四舍五入错误:
实数有无数个,但是js通过浮点数的形式只能表示其中有限个数(18437736874454810627个),所以很多时候仅仅是一个近似值。
采用了IEEE-754浮点数表示法(一种二进制表示法,可以精确地表示1/2,1/8,1/1024等),这导致类似0.1这样的简单数字都不能精确表示……(如.3-.2与.2-.1不相等)
/*真实运行环境:0.3-0.2=0.09999999999999998*/
文本:通过字符串类型来表示,而字符串由一组16位值组成的不可变的有序序列。
字符串:长度是16位值的个数。/*没有所谓的字符型*/
字符串所有的操作方法都是作用于16位值,而非字符,且不会对代理项对做单独处理,也不会做标准化加工,甚至不能保证字符串是合法的UTF-16格式。
字符串直接量:单引号与双引号之间可以相互包含。
ECMAScript3中,字符串直接量必须写在一行。
ECMAScript5中,字符串直接量拆开写每行需用反斜线“\”结束。
转移字符:以"\"加上一个字符就会发生化学反应……
\n:换行符
\o:NUL字符
\b:退格符
\t:水平制表符
\v:垂直制表符
\f:换页符
\r:回车符
\‘:单引号;\":双引号;\\:反斜线;
有两个特殊的转义字符是通用的:
\xXX:通过16进制数表示Latin-1或Unicode中的任意字码。/*例如\xA9表示版权符号*/
\uXXXX:由4个十六进制数指定任意的Unicode字符。/*例如\u03c0表示字符π*/
J s的内置功能:
1.字符串之间用"+"可以连接
字符串的方法:
str.charAt(index):获取str对应下标为index的字符
str.substring(start,length):获取str从下标start开始,长度为length的子字符串。/*与slice方法相同*/
str.slice(-3):获取最后三个字符。/*只有一个参数的情况*/
str.indexOf("l"):字符"l"首次出现的位置,对应的有str.lastIndexOf("l"),以及s.indexOf("l",3);从位置3开始(包括位置3),首次出现字符"l"的位置。
str.split(","):分割成若干子串,即字符串数组。
str.replace("h","H"):将str中所有的"h"替换成"H"。
str.toUpperCase():全部大写,对应的有toLowerCase();
记住,在Js中字符串是固定不变的,类似replace()以及toUpperCase()的方法都是返回新字符串,原字符串本身并没有发生变化
/*在ECMAScript5成型之间,绝大部分的浏览器已经支持str[index]的访问形式。*/
模式匹配:
Js定义了RegExp()构造函数,用来创建表示文本匹配模式的对象。这种模式称为"正则表达式",采用的是Perl中的正则表达式语法。
String和RegExp对象均定义了利用正则表达式进行模式匹配和查找与替换的函数。
RegExp:是一种强大和常用的文本处理工具。
1.并不是JavaScript的基本类型,和Date一样,只是一种具有实用API的特殊对象。/*API很丰富*/
2.但是依然具有直接量写法。/*两条斜线之间的文本构成一个正则表达式直接量*/
RegExp的语法规则:
/^HTML/ 匹配以HTML开始的字符串
/[1-9][0-9]*/ 匹配一个非零数字,后面是任意个数字
/\bjavascript\b/i 匹配单词"javascript",忽略大小写
RegExp的方法:
pattern.test(str);返回布尔值,是否匹配成功
str.search(pattern);返回首次匹配成功的位置。如果匹配不到,返回-1
str.match(pattern);所有匹配组成的数组
str.replace(pattern,"#");将匹配到的都替换成"#"
str.split(/\D+/);用非数字字符截取字符串。/*例如:"a1,2,3"=>["","1","2","3"]*/
布尔值:任何JavaScript的值都可以转换为布尔值。当js期望使用一个布尔值的时候,假值会被当成false,真值会被当成true
false(假值):undefined,null,0,-0,NaN,"" //空字符串
true(真值):其他所有值,包括所有对象(数组)
所以直接用if(o)来判断对象o是不是假值。/*这里有一个操作符可以学习:!==,不等操作符,*/
API:toString(),转换成对应的字符串,"true","false"
布尔运算符:
&&:与(AND)操作
||:或(OR)操作
!:非(NOT)操作,一元操作符
null:特殊值,用来描述"空值",执行typeof运算返回字符串"object",可见是一个特殊的对象值,含义是"非对象"。
通常认为null是它自有类型的唯一一个成员,表示数字、字符串和对象是"无值"的。
undefined:更深层次地明确是"未定义"。也表示"值得空缺"。与null在"=="是相等的,但是在"==="是不等的。
/*null和undefined没有任何属性和方法,所以使用"."或者"[]"会报类型错误:TypeError*/
/*undefined,系统级的,出乎意料的或类似错误的值的空缺;null,程序级的,正常的或意料之中的值的空缺--->赋值给变量或者属性,用于参数传入函数*/
全局对象:在JavaScript解释器启动时会创建一个新的全局对象,并给它一组定义的初始属性:
.全局属性,比如undefined,Infinity和NaN
.全局函数,比如isNaN()、parseInt()和eval()
.构造函数,比如Date()、RegExp()、String()、Object()和Array()
.全局对象,比如Math和JSON
/*这些初始属性并不是保留字,但是应该作为保留字来对待。*/
在代码的最顶级,使用this关键字可以引用全局对象:var global=this;
在客户端JavaScript中,Window对象充当了全局对象,其中的window就相当于前文讲到的this来引用全局对象,
除此之外,它针对Web浏览器和客户端JavaScript定义了一少部分其他全局属性。
PS:如果代码声明了一个全局变量,那么这个全局变量就是全局对象的一个属性。
包装对象:
js对象是一种复合值(它是属性或已命名值的集合)
通过"."符号来引用属性值,如果该属性值是一个函数时,称其为方法,调用时需加上"()"。
1.var s="hello world";这里的s是字符串直接量,本身不是对象,没有任何的属性和方法。
2.但是当引用s.substring(0,2)等字符串的属性的时候,就会通过调用new String(s)的方法转换成对象。
3.当属性引用完毕后,便会销毁这个对象。---这里的临时对象就是被称作包装对象
同理数字和布尔值也是如此,一个是通过Number(),一个是Boolean()