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最核心的功能,学习使用组件也是必不可少 ...
随机推荐
- c++错误崩溃3
使用了new申请了内存但是没有释放内存, 在程序长时间运行过程中不断的申请内存导致内存满了,再向内存写数据的时候回崩溃
- (转)flash的Socket通讯沙箱和安全策略问题
一.沙箱和安全策略问题 1.此问题发生在连接时,准确地说是连接前,分别两种情况: 1.本地播放 本地播放时,默认情况下Flash Player将不允许swf访问任何网络. 访问http://www.m ...
- HDU2054_A == B ?【模拟题】【大数】【水的问题】
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 【floyd求最小环】【Vijos 1046】【观光旅游】
标签:图结构 最短路 题目大意:给你一个无向图,至少经过3个节点的简单回路(不能包括其他环) 一开始的思路:用一个NUM[i][j]表示i到j的最短路经过几个节点,显然解法不太优美,而且还是错的 再想 ...
- HashMap为什么线程不安全(hash碰撞与扩容导致)
一直以来都知道HashMap是线程不安全的,但是到底为什么线程不安全,在多线程操作情况下什么时候线程不安全? 让我们先来了解一下HashMap的底层存储结构,HashMap底层是一个Entry数组,一 ...
- ADO.NET DataSet、DataTable、DataRow、DataView的学习
对于一个datatable中的数据进行嵌套查询判断某几列数据是否相同从而确定这条数据是否一样,并确定他重复的次数COUNT1字段. 例如: DataTable dt = new DataTable() ...
- JavaScript 【跨浏览器处理XML,做个兼容】
//兼容方法 function getXMLDOM(xmlStr) { var xmlDom = null; if (typeof windo ...
- javascript设计模式——Module
Module模式是提供公有和私有方法的代码块,有利于封装组织代码,可减少变量及函数名与其它模块的冲突. 推荐阅读: http://www.adequatelygood.com/JavaScript-M ...
- iOS切换window根控制器 (转)
转自linfengwenyou 在运行过程中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器) 方法一: 1. appdelegate.m中 self.window = [[UIWin ...
- Ubuntu安装Microsoft Windows Fonts微软字体库
ttf-mscorefonts-installer包是微软的字体包, 可以直接在软件中心中找到安装,也可以通过命令安装 sudo apt-get install ttf-mscorefonts-ins ...