Javascript类型、值和变量
JS数据类型分为两类:
-
原始类型*:number、string、boolean;(特殊原始值:null和undefined);原始值是不可更改的。
-
对象类型:对象、数组、函数;
如果使用函数来初始化一个新建对象,则称之为构造函数,每个构造函数定义一个类对象,这类对象是由构造函数初始化的对象组成的集合。eg:Array类、Function类、Date类、RegExp类、Error类
JS解释器内存管理机制:
可以自动对内存进行垃圾回收;当不再有任何引用指向一个对象,解释器就会知道这个对象没用了,自动回收它所占用的内存资源。
直接量:
就是程序中直接使用的数据值。
12 //数字整型直接量
1.2 //浮点数整型直接量
"hello world" //字符串文本
true //布尔值
/javascript/gi //正则表达式直接量
null //空
原始类型
数字
- 不区分整数值和浮点数值,所以不存在C语言里面的2/3=1的情况,JS采用IEEE-754这种二进制表示法可以精确的表示分数,但不能精确的表示类似0.1这样的简单数字,在任何二进制浮点数的编程语言都有这个问题,如下:
var x = 0.3-0.2;
var y = 0.2-0.1;
console.log(x==y); //false
console.log(x==0.1); //false
console.log(y==0.1); //true
- 除十进制整数直接量以外,JS还能识别十六进制值。但某些JS的实现支持八进制直接量,有些不支持,因此最好不要使用0为前缀的整形直接量,ES6严格模式下八进制明令禁止。
- 算术运算在溢出、下溢或被0整除时不会报错,上溢结果为无穷大值(用Infinity表示),下溢无穷小值(用-Infinity),基于这两者的加、减、乘除结果还是无穷大或无穷小。
- 0除以0是没有意义的,这种运算的结果是NaN(无穷大除以无穷大、给负数开平方等结果为非数字值的运算结果均为NaN);
var zero = 0;
var negz = -0;
console.log(zero === negz); //非数字值和任何值都不相等,包括自身
console.log(1/zero === 1/negz); //所有判断是否为非数值应该用x!==NaN来判断
- 当负数发生下溢时,返回一个特殊的值“-0”,这个值几乎和正常的0完全一样,但很少用到;
字符串
- 由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。JS中并没有表示单个字符的“字符型”,要表示一个16位值,只需要将其赋值给字符串变量即可,该字符串长度为1。字符串也可以当做只读数组,通过访问数组的方式访问。
- 字符串提供了许多可以调用的方法
但因为字符串是不可变的,因此以下方法虽然表面看起来获取到了更改以后的字符串的值,但实际上是返回了一个新的字符串,而以前的字符串本身没有任何改变。
var s = "hello world";
s.charAt(0); //查询下标为0处的字符
s.length; //返回字符串长度
s.slice(1,4); //截取下标1-4不包括4)的字符串
s.slice(-3); //截取倒数三个字符
s.indexOf("l"); //l字符首次出现的位置
s.lastIndexOf("l"); //l最后出现的位置
s.split(", "); //分割为字串:["hello", "world"]
s.replace("h", "H"); //将h替换为H
s.toUpperCase(); //字母均转为大写字母
//不可更改
console.log(s); //还是hello world
........
布尔值
任意的值都可以转换为布尔值,这些(undefined\null\0-0\NaN" ")会被转为false.
null和undefined
null和undefined的异同:
null是一个表示”无”的对象,可以将null认为是一个特殊的对象值,而含义是“非对象”。undefined是一个表示”无”的原始值,转为数值时为NaN。当声明的变量还未被初始化时,变量的默认值为undefined;
(1)Null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象
(2)Undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
a、变量被声明了,但没有赋值时,就等于undefined
b、调用函数时,应该提供的参数没有提供,该参数等于undefined
c、对象没有赋值属性,该属性的值为undefined
d、函数没有返回值时,默认返回undefined
对象类型
对象
类属性:对象的类属性是一个字符串,用以表示对象的类型信息。通过classof( )函数可以返回任意对象的类,可以传入任何类型的参数,以下是其代码:
function classof(o){
if(o === null) return "Null";
if(o === null) return "Undefined";
return Object.prototype.toString.call(o).slice(8, -1);
}
console.log(classof([]); //"Array"
对象直接量、Object.creat( )、自定义构造函数创建的对象类属性均为"Object"。
全局对象
当JS解释器启动时(或者任何Web浏览器加载新页面的时候),它将创建一个新的全局对象,并给它一组定义的初始属性:包括全局属性(undefined、NaN、Infinity…)、全局函数(isNaN()、eval()…)、构造函数(Date()、String()、Object()…)、全局对象(Math、JSON…);
Javascript中全局变量就是全局对象的属性。
//在代码的最顶级,在不在任何函数内的JavaScript代码,可以使用Javascript关键子this来引用全局对象:
var global = this; //定义一个引用全局对象的全局变量
在客户端Javascript中,其表示的浏览器窗口中的所有JavaScript代码中,Window对象充当全局变量,其有一个属性window引用自身,可以代替this。
包装对象
字符串不是对象为什么会有属性和方法呢?因为一旦引用了字符串的属性,JS就会自动将字符串通过new String(字符串)的方式转换为对象,该对象继承了字符串的方法,并用来处理属性的引用,一旦引用结束该对象就立即销毁。
var s = "hello";
console.log(s.length); //5,此处引用完成,立即销毁
s.len = 4; //再次转为对象,给该对象设置一个属性,引用完成立即销毁
console.log(s.len); //undefined
其他数据类型同理:String( )、Number( )、Boolean( ),也可通过此构造方法显式的创建包装对象。
原型(prototype)
每个JS对象(null除外)都和另一个对象相联系,并且从另一个对象那里继承属性,另一个对象即为该对象的原型,所有通过对象直接量创建的对象都具有另一个原型对象,可以理解为Java中子类和父类的关系。
- 要想检测一个对象是否是另一个对象的原型(或处于原型链中),使用is.PrototypeOf( )方法,p.isPrototypeOf(o)是检测p是否为o的原型。
创建对象
a. 对象直接量
对象直接量是一个表达式,这个表达式的每次运算都创建初始化一个新的对象。所以如果在一个重复调用的函数中循环体内使用了对象直接量,它将创建很多新对象。
var book = {
"main point" : "Javascript", //属性名空格必须引号
"sub-title":