JS 精粹(三)
(一)基本问题
JS的数据类型(不是数据结构)分:简单数据类型(undefined\null\boolean\string\number\symbol)、复杂数据类型(object).
对象是可变的键值对的集合,最关键是对象是无类型(class-free)的,也就是说对于新的属性值类型没有要求。属性名可以是name(标识符)、string(包括空字符串),很适合各类数据管理。最牛逼的机制是对象之间的非传统意义上的继承或是说委托更好一些;可以减少对象初始化的时间和内存。而且这是一种不同于类的新的编程思路。
对象的字面量表示法的属性名类型是字符串,虽然有时候输入的可能并不是字符串,但实际上是被转为了字符串;但若不符合标识符规则时就要显式的使用字符串。这在检索时会表现出来。对象查询属性时若找不到(包括原型链)返回undefined。可以使用"[]"、"."来获得,符合name规范时使用点访问法;其余使用[]访问法。若已有属性会被覆盖,若不含属性可以新建属性。
对象在堆内存中不会被复制,复制的是对象的引用。所以传递的函数、数组等都是引用而已。
(二)原型链问题
原型链是一种内部机制,我在我得第一篇博客已经表达过这个问题。就算根本不设置也会存在。对象有设置对象原型的方法DC原来提出有:
if ( typeof Object.beget !== "undefined") {
Object.create = function (obj) {
function F () {}
F.prototype = obj;
return new F();
}
}
另外,必须指出一下问题:使用返回的new F()的内部原型链由F.prototype更新。原型关系是一种动态关系,原型链中更新的时候,查找时会对其他立即显示。
对象属性的查找先从对象开始,然后会向原型链中查找。可以使用typeof来大致做一下过滤。
可以使用for/in语句来枚举对象的属性,但不能保证出来的顺序;同时还会枚举原型链的。可使typeOf和obj.hasOwnProperty()来过滤。如:
for ( var key in obj ) {
if (obj.hasOwnProperty(key)) {
if ( typeof key !=="function") {
//代码
}
}
}
可以使用delete来删除对象的属性,而不会修改原型链。
(三)减少全局变量污染
由于JS没有连接器,编译单元的顶级变量会出在全局变量中。为了减少变量污染,可以一个公共的接口来包含全局资源或使用闭包(与词法作用域相关)。
(四)其余问题
实际上对象的问题很复杂,这里不写了,以后陆续会有许多关于对象的问题。
JS 精粹(三)的更多相关文章
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构
JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...
- HTML5结合CSS的三种方法+结合JS的三种方法
HTML5+CSS: HTML中应用CSS的三种方法 一.内联 内联样式通过style属性直接套进HTML中去. 示例代码 <pstylepstyle="color:red" ...
- 异步加载js的三种方法
js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...
- (一)JQuery动态加载js的三种方法
Jquery动态加载js的三种方法如下: 第一种: $.getscript("test.js"); 例如: <script type="text/javascrip ...
- js中三种定义变量 const, var, let 的区别
js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...
- 玩转Node.js(三)
玩转Node.js(三) 上一节对于Nodejs的HTTP服务进行了较为详细的解析,而且也学会了将代码进行模块化,模块化以后每个功能都在单独的文件中,有利于代码的维护.接下来,我们要想想如何处理不同的 ...
- js获取三天后的日期
js获取三天后的日期 setDate getNowAddTreeFormatDate() { var date = new Date(); date.setDate(date.getDate()+3) ...
- Vue.js+vue-element搭建属于自己的后台管理模板:更深入了解Vue.js(三)
前言 上一章我们介绍了关于Vue实例中一些基本用法,但是组件.自定义指令.Render函数这些放到了本章来介绍,原因是它们要比前面讲的要难一些,组件是Vue.js最核心的功能,学习使用组件也是必不可少 ...
随机推荐
- hdu 5615 Jam's math problem(判断是否能合并多项式)
方法一:由十字相乘相关理论我们能知道,如果要有p,k,q,m,那么首先要有解,所以b*b-4*a*c要>0,然而因为p,k,q,m是正整数,所以代表x1,x2都是有理数,有理数是什么鬼呢?就是解 ...
- 使用ashx一般处理程序,读取不到Session的问题
一般的处理程序文件里面是用不了Session的,必须得实现Session接口才可以用. public class RandomCode : IHttpHandler, System.Web.Sessi ...
- iOS使用ffmpeg播放rstp实时监控视频数据流
一.编译针对iOS平台的ffmpeg库(kxmovie) 最近有一个项目.须要播放各种格式的音频.视频以及网络摄像头实时监控的视频流数据,经过多种折腾之后,最后选择了kxmovie,kxmovie项目 ...
- mysql 初始化
一.centos7下mysql 安装配置 yum -y install mariadb* systemctl start mariadb.service systemctl enable mariad ...
- Backup Exec Inventory 与Catalog的含义(转载)
编录:即catalog,就是让磁带机读取磁带之前所备份过的内容的目录列表,可以让你知道之前做过什么备份,以及备份时间等详细信息. 列清单:inventory,跟编录是不同,inventory是查询磁带 ...
- SqlServer2008(R2) 数据库使用外网IP实例连接服务器
1.打开sql2008,使用windows身份登录 2.登录后,右键选择"属性".左侧选择"安全性",选中右侧的"SQL Server 和 Windo ...
- winform使用xml作为数据源
1.新建窗体应用程序 2.拖放DataGridView 3.在bin\Debug中放入XML文件 using System; using System.Collections.Generic; usi ...
- 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题
在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChang ...
- GetRect:通过提供点和宽度返回对应矩形RECT
RECT GetRect(int x,int y,int width,int height); 描述:通过提供点和宽度返回对应矩形RECT 返回:矩形结构RECT 参数: x:X轴坐标 y:Y轴坐标 ...
- 几种画直线的方法-孙鑫C++笔记
// HDC画直线 CPoint m_ptOrigin ; void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptOrigin ...