位置: 编程技术 - 正文

JavaScript内核之基本概念(javascript核心技术)

编辑:rootadmin
本章主要讲述JavaScript中的数据类型(基本类型与引用类型),变量(包括变量的作用域),操作符(主要是一些较为常见,但是不容易从字面上理解的操作符)。由于JavaScript中的“一切皆对象”,在掌握了这些基本的概念之后,读者就可以较为轻松的理解诸如作用域,调用对象,闭包,currying等等较难理解的概念了。 数据类型 有程序设计经验的读者肯定知道,在C或者Java这样的语言中,数据是有类型的,比如用以表示用户名的属性是字符串,而一个雇员的年龄则是一个数字,表示UI上的一个开关按钮的数据模型则为布尔值等等,对数字可能还可以细分为浮点数,整型数,整型数又可能分为长整型和短整型,总而言之,它们都表示语言中的数据的值的类型。 JavaScript中的数据类型分为两种:基本数据类型和对象类型,其中对象类型包含对象,数组,以及函数(事实上,函数,数组等也都是对象,这个在后边的章节详述)。 1.1.1 基本数据类型 在JavaScript中,包含三种基本的数据类型,字符串(String),数值(Number),布尔值(boolean),下面是一些简单的例子: 我们可以分别查看变量的值及变量的类型: 注意,在此处使用的print()函数为rhino解释器的顶层对象的方法,可以用来打印字符串,通常情况下,在客户端,程序员多使用alert()进行类似的动作,alert()是浏览器中JavaScript解释器的顶层对象(window)的一个方法。 Hello, world 2.3 true string number number Boolean 在JavaScript中,所有的数字,不论是整型浮点,都属于“数字”基本类型。typeof是一个一元的操作符,在本章的另外一个小节会专门讲到。 1.1.2 对象类型 这里提到的对象不是对象本身,而是指一种类型,我们在第三章会对对象进行详细的讨论,此处的对象包括,对象(属性的集合,即键值的散列表),数组(有序的列表),函数(包含可执行的代码)。 对象类型是一种复合的数据类型,其基本元素由基本数据类型组成,当然不限于基本类型,比如对象类型中的值可以是其他的对象类型实例,我们通过例子来说明: 可以看到,对象具有属性,如obj.str, obj.num,这些属性的值可以是基本类型,事实上还可以更复杂,我们来看看他们的类型: 读者可能会对print(typeof array)打印出object感到奇怪,事实上,对象和数组的界限并不那么明显(事实上它们是属于同一类型的),但是他们的行为却非常不同,本书的后续章节将两个重要的数据类型做了分别介绍。 2.1.3 两者之间的转换 类似与Java中基本数据类型的自动装箱拆箱,JavaScript也有类似的动作,基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。我们可以通过几个例子来说明: str为一个字符串,通过typeof运算符可知其type为”string”,而: 可知,str2的type为”object”,即这两者并不相同,那么为什么可以使用str.length来的到str的长度呢?事实上,当使用str.length时,JavaScript会自动包装一个临时的String对象,内容为str的内容,然后获取该对象的length属性,最后,这个临时的对象将被释放。 而将对象转换为基本类型则是通过这样的方式:通过调用对象的valueOf()方法来取得对象的值,如果和上下文的类型匹配,则使用该值。如果valueOf取不到值的话,则需要调用对象的toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。由于JavaScript是弱类型的,所以JavaScript引擎需要根据上下文来“猜测”对象的类型,这就使得JavaScript的效率比编译型的语言要差一些。 valueOf()的作用是,将一个对象的值转换成一种合乎上下文需求的基本类型,toString()则名副其实,可以打印出对象对应的字符串,当然前提是你已经“重载”了Object的toString()方法。 事实上,这种转换规则会导致很多的问题,比如,所有的非空对象,在布尔值环境下,都会被转成true,比如: 初学者容易被JavaScript中的类型转换规则搞晕掉,很多情况下会觉得那种写法看着非常别扭,其实只需要掌握了规则,这些古怪的写法会大大的提高代码的性能,我们通过例子来学习这些规则: 通常可以在JS代码中发现这样的代码: 这种写法事实上具有更深层次的含义: 应该注意到,datamodel.item是一个对象(字符串,数字等),而if需要一个boolean型的表达式,所以这里进行了类型转换。在JavaScript中,如果上下文需要boolean型的值,则引擎会自动将对象转换为boolean类型。转换规则为,如果该对象非空,则转换为true,否则为false.因此我们可以采取这种简写的形式。 而在传统的编程语言(强类型)中,我们则需要: 2.1.4类型的判断 前面讲到JavaScript特性的时候,我们说过,JavaScript是一个弱类型的语言,但是有时我们需要知道变量在运行时的类型,比如,一个函数的参数预期为另一个函数: 当调用handleMessage的函数传递的handle不是一个函数则JavaScript引擎会报错,因此我们有必要在调用之前进行判断: 但是,typeof并不总是有效的,比如下面这种情况: 运行结果显示,对象obj和数组array的typeof值均为”object”,这样我们就无法准确判断了,这时候,可以通过调用instanceof来进行进一步的判断: print(obj instanceof Array);//false print(array instanceof Array);//true 第一行代码返回false,第二行则返回true。因此,我们可以将typeof操作符和instanceof操作符结合起来进行判断。 2.2 变量 变量,即通过一个名字将一个值关联起来,以后通过变量就可以引用到该值,比如: 当我们下一次要引用”Hello, Wrold”这个串进行某项操作时,我们只需要使用变量str即可,同样,我们可以用*num来表示*2.。变量的作用就是将值“存储”在这个变量上。 2.2.1基本类型和引用类型 在上一小节,我们介绍了JavaScript中的数据类型,其中基本类型如数字,布尔值,它们在内存中都有固定的大小,我们通过变量来直接访问基本类型的数据。而对于引用类型,如对象,数组和函数,由于它们的大小在原则上是不受任何限制的,故我们通过对其引用的访问来访问它们本身,引用本身是一个地址,即指向真实存储复杂对象的位置。 基本类型和引用类型的区别是比较明显的,我们来看几个例子: 运行结果如下: 1 1 2 1 这样的运行结果应该在你的意料之内,没有什么特别之处,我们再来看看引用类型的例子,由于数组的长度非固定,可以动态增删,因此数组为引用类型: 引用指向的是地址,也就是说,引用不会指向引用本身,而是指向该引用所对应的实际对象。因此通过修改array指向的数组,则arrayRef指向的是同一个对象,因此运行效果如下: 1,2,3,4,5,6 2.2.2变量的作用域 变量被定义的区域即为其作用域,全局变量具有全局作用域;局部变量,比如声明在函数内部的变量则具有局部作用域,在函数的外部是不能直接访问的。比如: 应该注意的是,在函数内var关键字是必须的,如果使用了变量而没有写var关键字,则默认的操作是对全局对象的,比如: 由于函数func中使用variable而没有关键字var,则默认是对全局对象variable属性做的操作(修改variable的值为in),因此此段代码会打印: in in 2.3运算符 运算符,通常是容易被忽略的一个内容,但是一些比较古怪的语法现象仍然可能需要用到运算符的结合率或者其作用来进行解释,JavaScript中,运算符是一定需要注意的地方,有很多具有JS编程经验的人仍然免不了被搞得晕头转向。 我们在这一节主要讲解这样几个运算符: 2.3.1中括号运算符([]) []运算符可用在数组对象和对象上,从数组中按下标取值: 而[]同样可以作用于对象,一般而言,对象中的属性的值是通过点(.)运算符来取值,如: 但是考虑到这样一种情况,我们在遍历一个对象的时候,对其中的属性的键(key)是一无所知的,我们怎么通过点(.)来访问呢?这时候我们就可以使用[]运算符: 运行结果如下: field:slef printInfo:function (){ print(this.field); } 2.3.2点运算符(.) 点运算符的左边为一个对象(属性的集合),右边为属性名,应该注意的是右边的值除了作为左边的对象的属性外,同时还可能是它自己的右边的值的对象: 这个例子中,outter作为object的属性,同时又是printInnerText()的对象。 2.3.3 == 和 === 以及 != 和 !== 运算符==读作相等,而运算符===则读作等同。这两种运算符操作都是在JavaScript代码中经常见到的,但是意义则不完全相同,简而言之,相等操作符会对两边的操作数做类型转换,而等同则不会。我们还是通过例子来说明: print(1 == true); print(1 === true); print("" == false); print("" === false); print(null == undefined); print(null === undefined); 运行结果如下: 相等和等同运算符的规则分别如下: 相等运算符 如果操作数具有相同的类型,则判断其等同性,如果两个操作数的值相等,则返回true(相等),否则返回false(不相等). 如果操作数的类型不同,则按照这样的情况来判断: ◆ null和undefined相等 ◆ 其中一个是数字,另一个是字符串,则将字符串转换为数字,在做比较 ◆ 其中一个是true,先转换成1(false则转换为0)在做比较 ◆ 如果一个值是对象,另一个是数字/字符串,则将对象转换为原始值(通过toString()或者valueOf()方法) ◆ 其他情况,则直接返回false 等同运算符 如果操作数的类型不同,则不进行值的判断,直接返回false 如果操作数的类型相同,分下列情况来判断: ◆ 都是数字的情况,如果值相同,则两者等同(有一个例外,就是NaN,NaN与其本身也不相等),否则不等同 ◆ 都是字符串的情况,与其他程序设计语言一样,如果串的值不等,则不等同,否则等同 ◆ 都是布尔值,且值均为true/false,则等同,否则不等同 ◆ 如果两个操作数引用同一个对象(数组,函数),则两者完全等同,否则不等同 ◆ 如果两个操作数均为null/undefined,则等同,否则不等同 比如: 会返回: true true 再来看一个对象的例子: 返回值为: true false obj1是一个对象,而obj2是一个结构与之完全不同的字符串,而如果用相等操作符来判断,则两者是完全相同的,因为obj1重载了顶层对象的toString()方法。 而!=不等和!==不等同,则与==/!==相反。因此,在JavaScript中,使用相等/等同,不等/不等同的时候,一定要注意类型的转换,这里推荐使用等同/不等同来进行判断,这样可以避免一些难以调试的bug。

推荐整理分享JavaScript内核之基本概念(javascript核心技术),希望有所帮助,仅作参考,欢迎阅读内容。

JavaScript内核之基本概念(javascript核心技术)

文章相关热门搜索词:javascript核心,javascript的内置函数有哪些,javascript核心技术,js内核是什么,js内核是什么,javascript的核心组成部分,内部javascript,js内核是什么,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript入门之对象与JSON详解 JavaScript对象与传统的面向对象中的对象几乎没有相似之处,传统的面向对象语言中,创建一个对象必须先有对象的模板:类,类中定义了对象的属性和

JavaScript入门之基本函数详解 总的来说,函数在JavaScript中可以:◆被赋值给一个变量◆被赋值为对象的属性◆作为参数被传入别的函数◆作为函数的结果被返回◆用字面量来创建函

JavaScript入门之事件、cookie、定时等 一篇关于JavaScript语言入门的文章涵盖了JavaScript语言中许多最基础的内容,从创建脚本标签到使用注释、把JavaScript文件包含到HTML文档中、定义变量、使

标签: javascript核心技术

本文链接地址:https://www.jiuchutong.com/biancheng/380544.html 转载请保留说明!

上一篇:JavaScript入门之语言基础第1/2页(js 入门)

下一篇:JavaScript入门之对象与JSON详解(javascript教程chm)

  • 印花税征税对象包括哪些
  • 当月出租设备需要发票吗
  • 计提工资附什么单据
  • 增值税报税后多久缴纳期限
  • 村集体土地出租公示
  • 营改增的增值税
  • 企业所得税的税率
  • 跨年发票是否可以报销 审计
  • 免税收入的三个条件
  • 进口环节关税税率
  • 金税盘发票号码确认显示不全
  • 即征即退增值税政策
  • 税控设备维修费怎么算
  • 新金融工具准则投资收益
  • 会计中包装物计入
  • 法人股东获得分红的规定
  • 计划成本法如何计算材料成本差异率
  • 事业单位购入车辆如何做账
  • 供应商的账怎么记
  • 怎么计算房产税率
  • 固定资产发现入账错误折旧如何处理?
  • 服务器研发属于什么行业
  • 在银行买理财产品
  • window10最新20h2
  • 个人出售普通住房个人所得税
  • win7右键设置方法
  • 收到对方公司开出发票如何做账
  • WIN7系统如何共享打印机
  • 固态硬盘最新接口
  • 注销后怎么补缴社保
  • vue-router
  • 阐述php的特点
  • xml格式化输出
  • PHP自定义函数返回两个数中大的那个
  • 下列项目的进项税额可从销项税
  • 企业的职工教育经费计入什么费用
  • es6从入门到实战
  • 跨期发票的形成条件
  • 补开上年发票的税务处理要怎么做?
  • 财政拨款事业单位的办公用车免征车船税吗
  • 技术服务收入属于什么收入
  • 开票资料更改
  • sqlserver 查询语句
  • 企业期末预收账款怎么算
  • 以前年度税费减免税
  • 股权转让低于净资产的税怎么算
  • 检测公司成本科目
  • 计提短期借款利息分录
  • 上月未记账
  • 出租房屋损坏赔偿
  • 租来设备本身原因致人损害
  • 汽车加油费属于交通费用吗
  • 为别人开发票先收的税金怎么入帐?
  • 旅游服务小规模差额税率
  • 航天开票系统怎么导出已开票明细
  • 滴滴出行怎么开纸质发票
  • sql server 执行语句
  • sqlserver获取当前年
  • 苹果电脑怎么截屏按哪个键
  • centos7 network
  • windows7安装过程中出错
  • windows8安装程序
  • node .js
  • opengl英文
  • three.js怎么用
  • shell案例讲解
  • Perl的Mail::POP3Client模块和Gmail通信实例
  • Unity3D游戏开发标准教程
  • nodejs内置的包管理器
  • JavaScript html5 canvas绘制时钟效果(二)
  • shell 查找最新文件
  • android download(international)
  • js能实现的简单效果
  • js自动切换图片效果
  • 在javascript中什么方法可以对数组元素进行排序
  • python3中map
  • 房产交契税网上可以交吗
  • 丰台和朝阳中间是哪里
  • 有限合伙企业怎么交税
  • 优税猫是什么运营模式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设