《javascript高级程序设计(第二版)》学习(2)

数值转换:有3个函数可以把非数值转为数值,Number(),parseInt(),parseFloat()。

对于Number() 如果是

  • 布尔型,true为1,false为0;
  • Null为0;
  • undefined为NaN;
  • 而字符串情况就比较多:如果有包含数字(不论是整数还是浮点数,抑或是有效的十六进制数如0xf)都会转变为数字,如“11a1”只输出11,“0xa11”则会按照16进制输出。字符串如果是空的,则为0;上述情况以外的字符,则为NaN;
  • 如果是对象,会先调用对象的valueOf()方法,然后依照前面规则;如果是NaN,则调用toString();再次按照前面的规则来转换;

parseInt()用的比较多,会忽略字符串前面的空格,直到找到第一个非空格字符,如果找到的这个不是数字字符或者负号,就会返回NaN。因此“22.2”“22blue”这两个输出的都是22,前者因为“.”不符合,后者因为blue不符合。在对进制的转换存在分歧,因此可以指定第二个参数,来指定他的基数。

例如parseInt("10", 10) ,parseInt("10", 8)。当指定了16进制的时候,字符串可以不带前面的0x。

parseFloat()与上面类似,不同的是,它可以解析浮点数,但出现第二个“.”的时候,就停止转换。另外他只能做十进制的,没有第二个参数,所以会忽略十六进制的“0x”前面的0;

toString()方法一般不会传递参数,某些情况也可以传递一个参数,作为输出数值的基数。

var num=10;
alert(num.toString(2)) //输出1010

要把某个数值转变为字符串,可以使用“+”号操作符,把它与一个字符串("")加在一起,输出的结果就是字符串

在ECMAScript中,Object类型是所有它的实例的基础。Object具有下列的属性和方法:(ECMA-262)

  • Constructor:保存用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于检查给定的属性是否在当前对象的实例中是否存在,其中propertyName必须以字符串形式指定;
  • isPrototypeOf(object):用于检查传入的对象是否是另外一个对象的原型。
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否可以用for-in来枚举;
  • toString():返回对象的字符串表示;
  • valueOf():返回对象的字符串,数值或者布尔值表示。

switch语句中可以使用任何数据类型,甚至是对象都可以。其次,每个case值不一定是常量,甚至可以是变量,甚至是表达式。

switch("hello world"){
    case"hello"+"world":
          alert("greeting was found");
          break;
    case"goodbye":
          alert("closing was found");
          break;
    default:
          alert("Unexpected message was found");
}

参数

在ECMAScirpt中的参数内部是用一个数组来表示的,函数接收到的始终是这个数组,而不关系数组中包含了那些参数。实际上,在函数体内,可以通过arguments对象访问这个参数数组,从而获取传递给函数的每一个参数。arguments对象只是与数组类似,可以使用索引来访问其中的参数。

//下面这个函数没有定义参数,但是这个方法依然是可以的
function sayHi(){
    alert("hello"+arguments[0]+arguments[1]);
}

sayHi("mike", "goodmorning"); //执行结果 hello mike goodmorning

在JavaScript的严格模式中,对于arguments对象做了限制,如下面这种赋值方法就会变得无效

function doAdd(num1, num2){
    arguments[1]=10;
    alert(arguments[0]+num2); //这里num2已经被赋值为10了
}

每次执行doAdd()函数都会重写第二个参数,将第二个参数的值变为10.因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1]也就修改了num2。不过读取这两个值并非是访问相同的内存空间:他们的内存空间是独立的,但值会同步,这种影响是单向的,修改num2不会改变arguments[1]的值。另外,如果只传入了一个参数,那么arguments[1]设置的值不会反映到命名参数(就是括号中的参数)中去。因为arguments对象的长度是由传入的参数个数来决定的,而不是定义函数的命名参数个数决定的。另外,没有传递值得命名参数将自动被赋予undefined。



ECMAScript变量可能包含两种不同的数据类型:基本数据类型(简单的数据段)和引用类型值(由多个值构成的对象)

5中基本数据类型(undefined,null,Boolean,number,string)是按值访问的,因为可以操作保存在变量中的实际的值。引用类型的值是保存在内存中的对象,和其他语言不同,JavaScript不允许直接访问内存中的位置,不能直接操作对象的内存空间。在操作对象时,实际上操作对象的引用,而不是实际的对象。因而,引用类型的值是按照引用访问的。

复制变量的值:在从一个变量向另外一个变量复制基本类型值和引用类型时,也存在差异。

/*
下面的例子中,num1中保存的是5,用num1去初始化num2时,num2也保存了5,但这两个5是完全独立的,不受彼此的影响
*/
var num1=5;
var num2=num1;

/*
引用类型的值就不一样,下面例子中变量obj1保存了一个对象的新实例。然后,赋予到obj2中,这时连个都指向了同一个对象。当obj1增加了name后,obj2也拥有了这个属性
*/

var obj1=new Object();
var obj2=obj1;
obj1.name="mike";
alert(obj2.name); //输出Mike;

传递参数

ECMAScript中所有函数的参数都是按照值传递的。

/*
基本数据类型的参数传递是按照值来传递的,函数内的修改无法传递给外部
*/
function addTen(num){
    num += 10;
    return num;
}

var count=20;
var result=addTen(count);
alert(count); //20 没有变化
alert(result); //30

/*
引用类型的值的参数传递依然是值传递,如果是引用传递,那么再第二次修改的时候,就应该得到“jim”。但是当访问name属性的时候,得到的依然是mike。说明即使再函数内部修改了参数的值,但原始的引用仍然没有变化。实际上函数内部重写obj时,得到的是局部对象,在执行完毕后就被垃圾回收机制回收了。
*/
function setName(obj){
    obj.name="mike";
    obj=new Object();
    obj.name="jim";
    alert("local: "+obj.name);  //局部对象时jim
}

function setName(obj){
    obj.name="mike";
    //obj={};
    obj.name="jim";  //这个得到的结果就是jim,覆盖了之前的赋值
}

var person=new Object();
setName(person);
alert(person.name); //mike
时间: 2024-12-17 21:21:34

《javascript高级程序设计(第二版)》学习(2)的相关文章

《JavaScript高级程序设计 第二版》理解对象

声明:这类属于学习笔记,主要是摘录书中内容,比较少的整理.内容经常是跳跃的,建议您阅读书本,收益更大. ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值,对象或者函数” 对象时一组没有特定顺序的值,每个属性或方法都有一个名字,每个名字都映射一个值. 每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发人员定义的类型 常规的创建对象的方法是通过Object这个内置对象来进行创建出一个实例,然后再給其添加属性和方法 var person=new

《JavaScript高级程序设计》的学习总结 二

引言:在学习JavaScript之前,我们要先学习如何在HTML中引用JavaScript,此篇总结将会详细介绍<script>元素的用法及其属性,并分析几种引用方式的优劣,以及延迟脚本和异步脚本的区别. <script>的介绍及其属性: 向HTML中插入JavaScript的只要方法使用<script>元素,这个元素由Netscape (网景公司)创造,并在Netscape Navigator 2中首先实现,后来这个元素被加入到正式的HTML规范中.HTML4.01

Javascript高级程序设计——第二章:在HTML中使用Javascript

第二章:在HTML中使用Javascript <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该立即下载脚本,但不妨碍页面的其他操作,比如下载其他资源或等待加载其他脚本,只针对外部脚本有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只针对外部脚本有效. src:可选.表示包含要执行代码的外部文件. type:可选.表示编写代码使用

读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 language 没用了 src type 描述代码内容Mine类型 默认就是text/javascript 没什么用 2 在解释器对<script>元素内部的所有代码求值完毕以前 页面中的其余内容都不会被浏览器加载或显示 3 有两种script 嵌入式 外部引入式 在解析外部引入式的js文件时,页面的

javascript高级程序设计---第二、三章

在HTML中引用javaScript javascript的几个属性  type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 只适用于外部加载 先于load执行) 在HTML中使用外部JS代码的优点,1.便于维护 ,2.可缓存.3.适应未来. 在javascript中区分变量的大小写 比如(test 和 Text是?的两个变量) 在ECMA5中新模式,严格模式  'use strict'在js代码中加入这句话即为严格模式

JavaScript高级程序设计(第三版)学习,第一次总结

Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一个网页或一个全局作用域 Array.isArray(arr); //最终确定某个值到底是不是数组,没有限制 转换方法 arr.toString(); //返回由数组每个值的字符串形式拼接而成的以逗号分隔的字符串 arr.valueOf(); //与toString方法一致 arr.toLocalSt

JavaScript高级程序设计(第三版)学习笔记20、21、23章

第20章,JSON JSON(JavaScript Object Notation,JavaScript对象表示法),是JavaScript的一个严格的子集. JSON可表示一下三种类型值: 简单值:字符串,数值,布尔值,null,不支持js特殊值:undefined 对象:一组无序的键值对 数组:一组有序的值的列表 不支持变量,函数或对象实例 注:JSON的字符串必须使用双引号,这是与JavaScript字符串最大的区别 对象 { "name":"Nicholas"

《JavaScript高级程序设计》(第二版)

这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量,他出的书都广受好评.这本书已经出了第二版,而且与第一版相比内 容更新很大,直接第二版就行.不要被书名的“高级”唬住,只要有JS基础语法知识和DOM基础知识就行,而且本书开始阶段还是介绍JS和DOM的语法知 识. 评论:重点推荐一下第五章(类型),第六章(OOP),第七章(匿名),多看几遍,至少要完全

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.

JavaScript高级程序设计学习(四)之引用类型

在javascript中也是有引用类型的,java同样如此. javascript常见也比较常用的引用类型就熟Object和Array. 一个对象和一个数组,这个在前后端分离开发中也用的最多.比如ajax传参,有时我不仅仅只是需要一个参数,例如添加方法,传的是一个对象,对象存在属性.在java中对象也可以说类.因为类存在属性,例如人类,他的属性有身高,体重,姓名,年龄,性别等.而js对象,也可以这样,比如车,它可以有品牌,颜色,造型等等. js对象可以做什么呢?同java对象有什么区别呢? 第一