JavaScript权威指南-读书笔记2

类型、值和变量

JavaScript有两种数据类型:原始类型和对象类型。原始类型包括数字、字符串和布尔值,另外有两个特殊的原始值:null(空)和undefined(未定义)。除了数字、字符串、布尔值、null和undefined之外的都是对象了。对象(object)是属性(property)的集合,每个属性都由“名/值对"(值可以是原始值,比如数字、字符串,也可以是对象)构成。

JavaScript语言核心定义的类:数组(Array)类、函数(Function)类、日期(Date)类、正则(RegExp)类和错误(Error)类。JavaScript解释器有自己的内存管理机制,可以自动对内存进行垃圾回收。JavaScript是一种面向对象的语言。在JavaScript中,只有null和undefined是无法拥有方法的值。

JavaScript的类型可以分为可变类型和不可变类型。数组和对象是可变类型,数字、布尔值、null和undefined属于不可变类型。字符串也是不可变的。JavaScript可以自由地进行数据类型转换。

1、数字

JavaScript可以识别十进制、十六进制和八进制(某些可以,某些不可以)。十六进制的直接量是指以"0x"或"0X"为前缀。八进制直接量以数字0课时。由于有些支持八进制,有些不支持,因此最好不要使用以0为前缀的整型直接量。

1.1 算术运算

Math.pow(2,10);   // 求幂
Math.round(.5);   //四舍五入
Math.ceil(.5);    //向上求整
Math.floor(.5);   //向下求整
Math.abs(-5);     //绝对值
Math.max(x,y,z);  //返回最大值
Math.min(x,y,z);  //返回最小值
Math.random();    //生成一个大于等于0小于1.0的伪随机数
Math.PI;          //π:圆周率
Math.E;           //e:自然对数的底数
Math.sqrt(3);     //3的平方根
Math.pow(3,1/3);  //3的立方根
Math.sin(0);      //三角函数:还有Math.cos,Math.atan等
Math.log(10);     //10的自然对数
Math.log(100)/Math.LN10;  //以10为底100的对数
Math.log(512)/Math.LN2;   //以2为底512的对数
Math.exp(3);      //e的三次幂

JavaScript中的算术运算在溢出、下溢或被零整除时不会报错。被零整除在JavaScript并不报错:它只是简单的返回无穷大或负无穷大。但有一个例外,零除以零是没有意义的,这种整除运算结果也是非数字值,用NaN表示。无穷大初一无穷大、给任意负数作开方运算或算术运算符与不是数字或无法转换为数字的操作数一起使用时都将返回NaN。JavaScript预定义了全局变量Infinity和NaN,用来表示正无穷大和非数字值。

非数字值有一点特殊:它和任何值都不相等,,包括自身。也就是说,没办法通过x==NaN来判断变量x是否是NaN。相反。应当使用x!=x来判断,当且仅当x为NaN的时候,表达式的结果才为true。函数isNaN()的作用与此类似,如果参数是NaN或者是一个非数字值(比如字符串和对象),则返回true。JavaScript中有一个类似的函数isFinite(),在参数不是NaN、Infinity或-Infinity的时候返回true。

1.2 日期和时间

Date()构造函数,用于创建表示日期和时间的对象。

var then=new Date(2011,0,1);  // 2011年1月1日
var later=new Date(2011,0,1,17,10,30);
var now=new Date();
var elapsed=now-then;
later.getFullYear();  //2011
later.getMonth();     //0:以0开始计数的月份
later.getDate();      //1:从1开始计数的天数
later.getDay();       //5:得到星期几,0代表星期日,5代表星期一
later.getHours();     //当前时间17:5pm
later.getUTCHours();  //使用UTC表示小时的时间,基于时区

2、文本

JavaScript字符串(和其数组)的索引从零开始:第一个字符的位置是0,第二个字符的位置是1,以此类推。

使用加号(+)作用于字符串,则表示字符串连接,将第二个字符串拼接在第一个之后。要得到一个字符串的长度,使用length属性。比如,要得到s的长度:s.length;

s="Hello,"+"world";
s.length;
s.charAt(0);   //第一个字符
s.charAt(s.length-1);  //最后一个字符
s.substring(1,4);      //第2-4个字符
s.slice(1,4);          //同上
s.slice(-3);           //最后三个字符
s.indexOf("l");        //字符l首次出现的位置
s.lastIndexOf("l");    //字符l最后一次出现的位置
s.indexOf("l",3);      //在位置3及之后首次出现字符l的位置
s.split(",");          //<span role="presentation" class="objectBox objectBox-array "><a target=_blank class="objectLink "><span role="presentation" class="arrayLeftBracket ">[</span></a><span role="presentation" class="objectBox objectBox-string ">"Hello"</span><span role="presentation" class="arrayComma ">, </span><span role="presentation" class="objectBox objectBox-string ">"world"</span><span role="presentation" class="arrayComma "></span><a target=_blank class="objectLink "><span role="presentation" class="arrayRightBracket ">]</span></a></span>分隔为子串
s.replace("H","h");    //<span role="presentation" class="objectBox objectBox-string ">"hello,world"</span>:全文字符替换
s.toUpperCase();       //<span role="presentation" class="objectBox objectBox-string ">"HELLO,WORLD"</span>

s="hello,world";
s[0];
s[s.length-1];

3、null和undefined

对null执行typeof预算,返回字符串"object",可以将null认为是一个特殊的对象指,含义是”非对象“。如果使用typeof运算符得到undefined的类型,则返回"undefined",表示这个值是这个类型的唯一成员。

尽管null和undefined是不同的,但他们都表示“值的空缺”,两者往往可以互换。判断相等运算符“==”认为两者是相等的(要使用严格相等运算符“===”来区分它们)。null和undefined都不包含任何属性和方法。

4、不可变的原始值和可变的对象引用

JavaScript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别,原始值是不可更改的。因为字符串看起来像由字符组成的数组,我们期望可以通过指定索引来修改字符串中的字符。实际上,JavaScript是禁止这样做的。字符串中所有方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值。

原始值的比较是值的比较:只有在它们的值相等时它们才相等。对于字符串来说而不明显:如果比较两个单独的字符串,当且仅当它们的长度相等且每个索引的字符都相等时,JavaScript才认为它们相等。

对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,它们也是不相等的。各个索引元素完全相等的两个数组也不相等。

var o={x:1},p={x:1};  //具有相同属性的两个对象
o==p;                 //false,两个单独的对象永不相等
var a=[],b=[];        //两个单独的空数组
a==b;                 //false,两个单独的数组永不相等
var a=[];
var b=a;
b[0]=1;
a[0]       //1.变量a也会修改
a==b;      //true,a和b引用一个数组,因此它们相等

下面的代码通过循环来完成数组复制:

var a=['a','b','c'];         
var b=[];  
for(var i=0;i<a.length;i++){    //遍历a[]的每个元素
  b[i]=a[i];                    //将元素值复制到b中
}
b.sort();

5、转换和相等性

很多类定义了更多特定版本的toString()方法。例如,数组类(Array class)的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串。函数类(Function class)的toString()方法返回这个函数的实现定义的表示方式。实际上,这里的实现方式是通常是将用户定义的函数转换为JavaScript源代码字符串。日期类(Date class)定义的toString()方法返回了一个可读的日期和字符串。RegExp类(RegExp class)定义的toString()方法将RegExp对象转换为表示正则表达式直接量的字符串。

var now=new Date();       //创建一个日期对象
typeof(now+1);            //string:"+"将日期转换为字符串
typeof(now-1);            //number:"-"使用对象到数字的装换
now==now.toString();      //true:隐式的和显式的字符串装换
now>(now-1);              // true:将日期转换为数字

6、变量声明

使用一个变量之前应当先声明。变量是使用关键字var来声明的。

如果未在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值之前,它的初始值就是undefined。

JavaScript中的变量声明中并没有指定变量的数据类型。变量可以是任意数据类型。例如,首先可以将数字赋值给一个变量,然后再将字符串赋值给这个变量,这是合法的:

var i=10;
i="ten";
使用var语句重复声明变量是合法且无害的。如果重复声明带有初始化器,那么这就和一个简单的赋值语句没什么两样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值