变量
数据类型分为 原始类型 和 对象类型
原始类型包括数字、字符串和布尔值
null 和 undefined 分别表示格子特殊类型的唯一的成员
除此之外就是对象。对象(object)是属性的集合,每个属性由名值对组成
普通的javascript对象是“命名值”的无序集合。数组是特殊的对象,表示带编号的值的有序集合。
函数是具有与它相关联的可执行代码的对象,都是真值。 如果函数用来初始化(new运算符),一个新创建的对象,称为构造函数。每个构造函数定义了一类(class)对象————
由构造函数初始化的对象组成的集合,类可以看做是对象类型的子类型。
除了数组类、和函数类,还有日期类、正则类、和错误类。 数字、布尔值、null和undefined属于不可变类型。
数字
负号是一元求反运算符,并不是数字直接量语法的组成部分。
通过Math对象的属性定义的函数和常量实现复杂的算数运算
Math.pow(2,8) 2的8次幂 Math.round(.6) 四舍五入 Math.ceil(.6) 向上取整 Math.floor(.6) 想下取整 Math.abs(-5) 取绝对值 Math.max(x,y,z) 返回最大值 Math.min(x,y,z) 返回最小值 Math.random() 生成一个大于等于0小于1的伪随机数 Math.PI 圆周率 Math.E 自然对数的底数 Math.sqrt(3) 求平方根 Math.pow(3,13) 3的立方根 Math.sin(0) 三角函数 Math.log(10) 10的自然对数 Math.log(100) Math.LN10 以10为底100的对数 Math.exp(3) e的三次幂
下溢是当运算结果无限接近0并比javascript能表示的最小值还小的时候发生的情况。这时会返回0。当负数发生下溢时会返回负零、
零除以零的结果是非数字值,用NaN表示。无穷大除以无穷大、给任意负数开方运算或
算术运算符与不是数字或无法转换为数字的操作数一起使用时 都返回NaN
NaN不与任何值相等,包括它自身 当且仅当x=NaN时,x!=x成立
isNaN()检测参数是否是非数值;isFinite()参数不是NaN、Infinity或-Infinity时返回true
javascript采用二进制表示法,不能准确表示类似0.1的数字
var x = 0.3 - 0.2; 0.09999999999999998 var y = 0.2 - 0.1; 0.1 x == y; false
Date构造函数用了创建表示日期和时间的对象
var then = new Date(2015, 3, 10); var now = new Date(); 当前日期和时间 var elapsed = now - then; 日期减法,计算时间间隔的毫秒数 now.getFullYear(); 2015 now.getMonth(); 从0开始计算的月数 now.getDate(); 从1开始计算的天数 now.getDay(); 星期,0代表星期日 now.getHovers(); 当前小时
文本
转义字符
如果\后不符合转义字符,则忽略\
+用于字符串时表示连接
字符串的length属性表示其长度
布尔值
下列值会被转换为false
undefined null NaN 0 -0 "" 其他值都会转换成true
null 和 undefined
null是特殊的对象值,含义是非对象、
undefined表示变量没有初始化
包装对象
存取字符串、数字或布尔值的属性时创建的临时对象成为包装对象 读取它们的属性值时和对象一样,但给属性赋值时会忽略这个操作 只要引用了字符串的属性,javascript就会将字符串通过调用new String()的方法转换成对象,这个对象继承了字符串的方法。
var s = ‘test‘; s.len = 4; //创建一个临时字符串对象,赋值后就销毁 var t = s.len; alert(t); //undefined
字符串、数字、布尔值的属性都是只读,不能给它们定义新属性
var s = ‘test‘; var S = new String(‘test‘); alert(typeof(s)); //string alert(typeof(S)); //object alert(s==S); //true alert(s===S); //false
原始值(undefined null 数字 字符串 布尔值)是不可更改的,任何方法都无法更改原始值
通常将对象称为引用类型,对象的比较均是引用的比较,当且仅当它们引用同一个基对象时才相等
取得对象或数组的副本,需要显式复制
var a = [1, 2, 3]; var b = []; for (var i = 0; i < a.length; i++) { b[i] = a[i]; }
比较两个独立的对象或数组,需要比较它们的属性或元素
function equalArrays(a, b) { if (a.length != b.length) return false; for (var i = 0; i < a.length; i++) { if a[i] != b[i] return false; } return true; }
类型转换
Boolean() Number() String() Object()
除了 null 和 undefined 外任何值都有 toString()方法
x + "" //等价于String(x)
+x //等价于Number(x)
!!x //等价于Boolean(x)
Number类
toString() 可接受基数 以下方法都四舍五入 toFixed() 根据小数点后的位数将数字转换为字符串,不使用指数计数法 toExponential() 用指数计数法转换为字符串,小数点后位数由参数决定 toPrecision() 根据指定的有效数字位数将数字转换为字符串 parseInt() 只解析整数,跳过任意的前导空格,如果第一个非空格字符是非法的数字直接量,返回NaN,可以接收第二个参数作为基数 parseFloat() 解析整数和负数 parseInt(‘ 44a4‘) //44 parseInt(‘$11‘) //NaN parseInt(‘-5‘) //-5
所有对象继承了两个转换方法:toString()和 valueOf()
toString()返回一个反映这个对象的字符串。 数组类将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串 函数类返回这个函数的实现定义的表示方法
valueOf()一般返回对象本身,日期类会返回它的内部表示:1970年1月1日以来的毫秒数
var a = function (){ document.write(‘hh‘); }; alert(typeof(a.valueOf())); //function var a = new Date(); alert(typeof(a.valueOf()));
+的其中一个操作数是对象,则会将其转换为原始值
var a = new Date();
typeof(a+1); //string
typeof(a-1); //number
函数作用域
变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的
function text(o) { var i = 1; if (typeof o == "object") { var j = 0; for (var k = 0; k < 10; k++) { console.log(k); } } console.log(j); //0 console.log(k); //10 } //i j k在函数体内均有定义
变量提前:函数里声明的所有变量(不涉及赋值)都被“提前”到函数体的顶部
var a = ‘aa‘; function f(o) { console.log(a); //undefined var a = ‘bb‘; console.log(a); //bb }
在函数体内局部变量覆盖了同名全局变量,但只有在程序执行到var语句时才被赋值,等价于Boolean
function f(o) { var a; console.log(a); a = ‘bb‘; console.log(a); }
声明全局变量实际上是定义了全局对象的一个属性。使用var声明变量时这个变量无法通过delete删除