位置: 编程技术 - 正文

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)

  • 哪些进项税额可以抵扣销项税额
  • 增值税普通发票有什么用
  • 进项税转出包括什么
  • 利润的敏感性分析怎么做?
  • 体检怎么写公司抬头
  • 以前年度损益调整结转到未分配利润
  • 事业单位个税可以自行申报吗
  • 公司车子的保养费怎么算
  • 公司属于亏损状态,但是法人个人收入算公司账吗
  • 其他公司归还货款会计分录
  • 支付的票据承兑手续费计入财务费用
  • 车辆固定资产清理
  • 通用机打发票什么样子
  • 不动产证上宗地图名字错一个字
  • 税务部门罚没收入会计分录
  • 办税员实名认证变更
  • 报销单大写金额填写格式1000
  • 递延和摊销
  • 小微企业免税销售额一栏怎么填
  • 酒店产权式经营业主取得的收入按股利红利所得
  • bios密码如何设置
  • Mac怎么用有线网络
  • linux怎么翻译
  • 不良资产购买流程
  • 丢失空白发票怎么处罚
  • 外购无形资产发生的交易费用
  • 说一下键盘
  • 开始菜单中的磁贴是什么
  • 公司给其他单位分红需要对方开票吗
  • 电脑开机显示屏显示无信号黑屏怎么办
  • phpifelse
  • 会计分录内容包括
  • 用人单位如何缴纳医疗保险
  • 工业会计成本核算读书笔记3000
  • 收到现金货款存入银行会计分录
  • 【创作赢红包】ChatGPT引爆全网引发的AI算力思考
  • react路由exact
  • vue中$route
  • 个人所得税纳税记录怎么查询
  • rabbitmq work queue
  • 国库集中支付发送签收失败
  • 企业出租的存货包括
  • 其他收益结转到什么账户
  • 政府会计业务活动费用会计分录
  • 物业费按年收
  • 存货的期末余额是账面余额吗
  • 补贴收入是否缴纳个税
  • 暂估的原材料用不用记原材料明细账
  • 预售期的房子是否可以买卖
  • 税务局退回水利基金账务怎么处理
  • 垫款报销
  • 公司收到股东的投资款以后怎么处理
  • 企业会计制度对固定资产无入账价值怎么入账
  • 跟老师出差路上可以聊些什么
  • 不动产经营租赁会计分录
  • 过账发票和不过票的区别
  • 母子公司资金往来财税问题
  • 升级打装备的手游
  • Windows 9 Storage Sense储存功能更多图像
  • 光盘安装系统怎么操作
  • 索尼vaio笔记本无法开机
  • win10笔记本连接不了wifi
  • slserves.exe - slserves是什么进程
  • nwtray.exe - nwtray是什么进程 作用是什么
  • win7系统安装谷歌浏览器
  • 电脑预装软件是什么意思
  • 模型变量是什么
  • vue动态引入模块
  • Node.js中的什么模块是用于处理文件和目录的
  • margin使用
  • js的继承方式
  • bootstrap按钮图标
  • python3.7 pip
  • jqgrid分页pager
  • 山东省国家税务局总局官网
  • 供暖企业所涉及的行业
  • 房产税的计税依据及税率
  • 中华人民共和国刑法
  • 煤矸石征收资源税吗
  • 我们是小规模纳税人,有个人所得税代扣代缴的业务吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设