位置: 编程技术 - 正文

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

发布时间:2024-02-27
本章主要讲述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)

  • 异地预缴附加税需要计提吗
  • 民间非盈利组织会计中所拥有的用于
  • 赞助支出计入
  • 房产税的计税基础包括契税吗
  • 临时税务登记的小规模纳税人 个人所得税如何申报
  • 企业代扣代缴个人所得税
  • 哪些增值税专用发票可以抵扣进项税
  • 新公司实收资本
  • 发票为啥一直显示上传不成功
  • 新会计准则开办费分摊
  • 土增税土地成本分摊方法
  • 账实不符如何调平
  • 预收账款怎样清零
  • 费用收入结转本年利润
  • 增值税普通发票几个点
  • 6位开票代码是什么意思
  • 航道疏浚服务属于什么服务
  • 将商业承兑汇票进行贴现 符有追索权的会计分录
  • 国产设备购置投资由设备原价与什么构成
  • 存货跌价准备会影响利润总额吗
  • 在建工程一次还是多次
  • 征信证明怎么开啊
  • 软件企业即征即退账务处理
  • 按月预缴企业所得税的企业有哪些
  • 政府补助不征税条件
  • 跨年度的费用发票可以入账吗
  • 民间非营利组织会计制度会计科目
  • 调整低电量通知怎么设置
  • 临时文件夹移动到c盘根目录下windows7
  • 建设工程招标办
  • 分公司可以独立诉讼吗
  • 收购发票哪一联做帐
  • 分享php源码批量运行
  • php解密在线
  • 关闭自动重新启动会怎样
  • win7界面旋转
  • 毛利率为负也可以投资吗
  • php抽奖程序源码
  • 前端如何将项目分类
  • 基于深度学习的图像超分辨率——综述
  • @enable
  • 应收账款等于什么加什么
  • 会计调整以前年度遗留问题查不出来说明怎么写
  • 注册劳务派遣公司需要验资吗
  • 员工买材料报销分录
  • 工资表怎么每个都有表头
  • 房东房租不开票违法吗
  • 发票金额大于实付金额
  • 资产负债表应收账款期末余额公式
  • 企业做账的流程图
  • MSSQL 2008 自动备份数据库的设置方法
  • 代建制取费标准
  • 个人转让不动产交印花税吗
  • 固定资产的类别
  • 解除劳动合同经济补偿金法律依据
  • 发工资的是会计还是出纳
  • 应收款钱已收回会计分录
  • 残保金是公司交还是员工交
  • 会计利润和税务利润的差异是什么
  • 会计账本是一年一本吗
  • 在sql server中使用对象资源管理器和SQL
  • 深入理解mysql主从原理32讲
  • windows7卸载所有软件
  • centos7升级内核后 无法启动
  • vmware虚拟化解决方案
  • 分布式交互
  • winxp如何删除网卡驱动
  • Mac显示桌面快捷键
  • win7旗舰版虚拟光驱下载
  • windows7出现错误恢复怎么办
  • javascript 浏览器
  • jquery表单验证代码
  • 什么叫真游戏
  • nodejs 异步任务队列
  • <2> unity3d 分包与上google play 之具体实战
  • python制作gui
  • JavaScript中的this
  • jQuery对checkbox 复选框的全选全不选反选的操作
  • jQuery实现table中的tr上下移动并保持序号不变的实例代码
  • 广西税务怎么交城乡养老保险
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号