JavaScript学习笔记1_基础与常识
1.六种数据类型
5种基础的:Undefined,Null,Boolean,Number,String(其中Undefined派生自Null)
1种复杂的:Object(本质是一组无序键值对)
2.字符串转数字
Number(str):先求值再转换(先valueOf再toString都不行就是NaN),一般与我们的预期结果不一样,比如Number(”)=Number(false)=Number(null)=0而var x;Number(x)=NaN。。。所以一般都用下面两种方式
parseInt(str):可以指定进制,建议使用parseInt(x, 10);这样的格式,即始终指明进制
parseFloat(str):不可以指定进制,解析整数时返回整数而不是浮点数
3.获取字符串长度
String类型的值都有length属性。str.length返回串长整数值,而不是通过其它函数来获取串长
4.值传递与地址传递
函数传参都是值传递
5.作用域链
本质是一个栈,存放了各层的变量对象(类似于编译器的符号表指针栈),变量对象持有该层所有变量和函数的访问权限,如果该层是函数,那么变量对象是arguments对象,栈顶是正在执行的上下文环境对应的变量对象,栈底是全局执行环境对应的变量对象。
6.作用域
没有块级作用域,有函数作用域
7.创建Object对象的2种方法
- var obj = new Object();obj.attr = value;
传统的方式,调用构造函数创建对象
- var obj = {attr1 : value1, attr2 : value2}或者var obj = {“attr1″ : value1, “attr2″ : value2}
对象字面量表示法,属性名可以是字符串
注意:
除非属性名有歧义例如:null, var等等,一般不要用字符串做属性名,当然只是习惯约束
用对象字面量方式定义对象时,不会调用其构造函数
8.访问属性值的两种方法
obj.attr
obj[“attr”] 优点是可以通过变量来访问属性,如var attrName = “attr”;obj[attrName]更灵活
9.数组的声明与初始化
var arr = new Array(value1, value2...);
var arr = Array(...);可以省略new
数组字面量:var arr = [value1, value2...];
注意:用数组字面量定义数组时也不会调用其构造函数
10.数组相关函数
见附录
11.函数声明与函数表达式的区别
function fun(){...} js引擎会在加载源代码时生成该函数对象
var fun = function(){...} js引擎在执行时才会生成该函数对象
12.函数重载
不支持重载。后声明的函数会覆盖先声明的,本质是对函数名进行了多次赋值操作(函数名只是一个指针变量)
13.函数内部特殊属性
arguments.callee 函数指针,指向拥有该arguments对象的函数,即当前函数
this 当前执行环境的引用,顶层的this就是window
arguments.callee.caller 函数指针,指向调用当前函数的函数,没有则返回null
注意:this可以是对象引用或者函数引用,但callee和caller只能是函数引用
14.函数对象的属性和方法
length 函数期望的命名参数的个数,js中可以给函数传递任意多个参数,因为除了形参,还可以用arguments获取任一参数
prototype 指向函数的原型对象
call(context, arg1, arg2...) 用来在特定的作用域中调用函数,解除对象与函数的紧耦合
apply(context, arguments或其它数组对象) 功能同上,支持数组参数
bind/unbind(context, arg1, arg2...) 绑定/解绑执行环境或参数,可以从已有函数生成新函数,但用bind连续绑定是无效的(连续 != 多次),例如:
以上代码输出’objdata’, ‘objdata’, ‘newobjdata’,第二次绑定失败了,因为bind函数内部是用call来实现的,连续绑定的效果类似于:
第二次绑定得到的函数中fun1内部的this确实指向newObj,但fun1中根本没有用到this,所以没有任何影响
15.一些常识
this永远指向自身所属的对象(你是谁的属性,你内部的this就是谁)
以上代码输出1和2,因为执行过倒数第二句后,obj2新增了一个fun属性,值为obj1.fun的引用,但因为obj2.fun是obj2的属性,所以this指向obj2
尽量在构造函数原型上定义成员函数,因为直接在构造函数中定义的函数有运行时闭包的开销
在js中应该用单引号,因为JSON和XML里只有双引号,用单引号可以避免转义
尽量在变量声明的同时初始化,以便区分undefined表示未声明。因为对已声明但未初始化的变量和未声明的变量用typeof操作符都会返回”undefined”
NaN(Not a Number)与任何值都不相等,包括NaN本身,所以需要用isNaN()函数来判断
只能给引用类型的值动态地添加属性。给基本类型的值添加属性不会报错但没有任何意义
数组会根据索引自动增长。需要注意length属性是可写的,也就是说可以动态地设置数组长度,如截掉尾部元素
函数名只是一个指针变量。function fun{...} fun = null;只是断开了引用关系,函数体并没有被销毁
附录
1.基础数据类型
Undefined 已定义但未初始化的对象的默认值
Null 表示一个空对象指针,所以用typeof检测之返回object
Boolean 布尔值,注意Boolean()转换函数,规则如下:
true/false ~ 不变
非空字符串/空字符串 ~ true/false
非0数字/0和NaN ~ true/false
任何对象/null ~ true/ false
undefined ~ false
上面这些规则非常重要,因为if条件会自动应用Boolean()转换,而且if(obj)是在js代码中是很常见的,很多时候流程控制错误都是if条件自动转换造成的
Number 数值,js中+0和-0相等,注意NaN,它与任何东西都不相等,包括自身,而且它既不大于n也不小于等于n。Number变量支持toString()函数,可以用来对数值串进行进制转换,例如var num = 17;num.toString(16)返回”11″
String 字符串,注意字符串的不可变性,进行巨量拼接操作时应该用数组 + join而不是循环+
2.Object类型变量的属性和方法
Constructor 保存这构造函数的引用
hasOwnProperty(porpertyName) 用来检查当前对象是否拥有指定属性(此处”属性“包括属性和方法)
isPrototypeOf(obj) 用来当前对象是不是指定对象的原型
propertyIsEnumerable(propertyName) 用来检测指定属性是否可枚举
toLocaleString() 相当于toString()函数,但附加了地区特征
toString() 返回对象的字符串表示
valueOf() 返回对象的字符串、数值或布尔值表示
3.常见引用类型
Function js中函数也是对象,非常灵活,例如:
Array 数组类型的操作函数是最多的
栈方函数:push() 在数组末尾插一项, pop() 尾元出栈
队列函数:push() 同上,shift() 首元出队并返回首元;反向队列(队头进,队尾出)unshift()/pop()
排序函数:sort(fun) 无参比较字符串升序排列,有璨传入自定义比较函数返回正值/负值/0;reverse() 反转顺序
注意:sort()/reverse()都会直接改变原数组,而且sort()默认实现方式不太科学,对[1, 3, 10, 5]排序的结果是[1, 10, 3, 5],想要心里想的结果,必须传入自定义比较函数
操作函数:
arr.concat(arr1, arr2...) 连接形成新数组
arr.slice() 相当于substring对字符串的截取效果,用法也一样
arr.splice() 向数组中部插入项,splice(startIndex, num, item1, item2...) 表示把从startIndex开始的num项替换为各个item,只有前两个参数表示把从startIndex开始的num项换为空(也就是删除),用splice可以实现删除/替换/插入操作。
注意:splice函数也会直接改变原数组。
位置函数:indexOf(value)和lastIndexOf(value),查找value的索引位置,没找到返回-1,内部用的是全等操作符(===)
迭代函数:every(), filter(), forEach(), map(), some()都是对数组中的每一项运行指定方法,IE9+支持且并不常用,在此不展开叙述
归约函数:reduce(), reduceRight() 不做介绍,原因同上
Date类型:相关内容略多,参见W3School
RegExp类型:var regex = /^cat$/i;创建正则表达式(RegExp类型),支持的模式有g, i, m分别表示全局模式,忽略大小写模式,多行模式。当然,也可以用new RegExp(strRegex, strMode),不过,有什么理由非要去用这种方式呢?
js支持正则捕获,var matches = regex.exec(text); 通过matches[0], matches[1]...来获取捕获到的内容
普通的正则匹配:regex.test(text)返回true/false
基本包装类型:Boolean,String和Number,一直都在见面,只是没有注意到,例如:
以上代码等价于:
自动装箱拆箱,为了让基础数据类型用起来更方便,但需要注意:new String()与String()转换方法不同,前者返回object类型,而后者返回string类型,鉴于这样的区别,混用会引起不必要的麻烦,所以我们没有理由显式创建包装类型。Boolean,Number与之类似。
JavaScript学习笔记1_基础与常识的更多相关文章
- JS学习笔记1_基础与常识
1.六种数据类型 5种基础的:Undefined,Null,Boolean,Number,String(其中Undefined派生自Null) 1种复杂的:Object(本质是一组无序键值对) 2.字 ...
- JavaScript学习笔记——对象基础
javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研 ...
- JavaScript学习笔记:基础知识点总结
基础概念 JavaScript(以下简称Js)中数据类型:Number 字符串 布尔值 数组 对象(Js的对象是一组由键值对组成的无序集合) Js中基础概念:变量(概念和Java中变量概念类似 指示某 ...
- 1. JavaScript学习笔记——JS基础
1. JavaScript基础 1.1 语法 严格区分大小写 标识符,第一个字符可以是 $,建议使用小驼峰法, 保留字.关键字.true.false.null不能作为标识符 JavaScript是用U ...
- JavaScript学习笔记(基础部分)
一.JavaScript简介: 概念:JavaScript是一种解释性的.跨平台的.基于对象的脚本语言,一般用于客户端来给HTML页面增加动态的功能. 组成: 1.ECMAScript,描述了该语言的 ...
- 廖雪峰JavaScript学习笔记(基础及数据类型、变量)
先睹为快 alert('我要学JavaScript!'); Run: 基本语法: 1.每个语句以;结束,不强制 2.语句块用{...} 3.//单行注释,/*...*/ 多行注释 数据类型: 1.不区 ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
随机推荐
- 浅谈android代码保护技术_加固
可看原文: http://www.cnblogs.com/jiaoxiake/p/6536824.html 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结 ...
- Python 面向对象class(2)
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...
- Linq学习<二>
http://www.cnblogs.com/wyqlijin/archive/2011/02/25/1964934.html 这位仁兄写的比较高深,建议大家看看 一: 这一篇以一个数据类为例,操作数 ...
- JAVA的编码转换测试
package test; import java.io.UnsupportedEncodingException; /** * * @author jim */ public class Test ...
- 编写高质量代码改善C#程序的157个建议——建议43:让接口中的泛型参数支持协变
建议43:让接口中的泛型参数支持协变 除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary&l ...
- 编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器
建议30:使用LINQ取代集合中的比较器和迭代器 LINQ提供了类似于SQL的语法来实现遍历.筛选与投影集合的功能. static void Main(string[] args) { List< ...
- OkHttp3的简单使用(二)
OkHttp3的简单封装 public class OkHttpUtil { public static final String TAG="OkHttpUtil"; privat ...
- [other] 代码量代码复杂度统计-lizard
[other] 代码量代码复杂度统计-lizard lizard的可以用来统计下面的一些数据 不包含代码注释的代码行数 CCN 代码的复杂度,也就是分支复杂度 token的个数(关键字,标示符,常量, ...
- 游戏中遇到的BUG
(1)bug描述:战斗中有英雄死亡,一方掉线之后再次上线,仍然可以看到死亡英雄空血条(英雄受到攻击才会显示血条) 解决方案:原来 当前血量小于英雄血量最大值时,证明英雄受到伤害,血条显示为true I ...
- .Net Core .Net Core的学习
.Net Core 学习 一.什么是.net core? 百度百科: https://baike.baidu.com/item/.net%20core/20130686?fr=aladdin 个人总结 ...