javascript
2018-10-06 16:19:59 58 举报
AI智能生成
js基础
作者其他创作
大纲/内容
上古用法
document.write("
This is a heading
"); type="text/javascript"
document.getElementById("demo").innerHTML="My First JavaScript Function";
牢记js是不太靠谱的,设计上有很多漏洞,不要纠结一些奇怪的用法,记住最佳实践就可以。写程序时要避免歧义,不要在一些奇技淫巧上耗费时间。
基础
虽然分号是可选的,但一般都要有
执行顺序和页面加载顺序有关。浏览器拿到的是字节流,一边加载一边执行。
变量
数字(float、科学计数)、字符串、数组、对象、布尔、undefined、null
多声明
变量刚声明时是undefined
向未声明的 JavaScript 变量来分配值
全局变量与局部变量
NaN
数字:64位;浮点数不一定准确;八进制和16机制
对象
所有事物都是对象(但这里的对象和其他语言中的概念不同,有点像HashMap)。声明新变量时,可以使用关键词 "new" 来声明其类型,可用于强制类型转换
所有对象都可以动态增加属性和方法
但var test=""; 这样声明的对象不能直接test.key=value,要用var test=new String("");test.key=value; 数字和boolean同理,但一般没这么用的吧
后来才知道,ECMA定义了5种基本类型:Undefined、Null、Boolean、Number 和 String。这些变量是存在栈上,其他对象存在堆上。
ECMAScript 的 Boolean 值、数字和字符串的原始值的有趣之处在于它们是伪对象,尽量不要用,可能有各种奇怪问题
伪对象的意思是,这些类型还是原始类型,但在调用一些方法时,js引擎会隐式的做类型转换,所以可以有"abc".length这种用法,但不能"abc".key="value"
声明数组可以new Array()或[]
声明对象可以new Object()或{}
很多时候对象和json等价。person.lastname或person["lastname"]
对象也可以用所谓的构造函数初始化,但一般和原型方法混用
直接从普通的函数生成对象,是个很奇怪的设计。。。
可以这么理解:new Func()的原理就是先var tmp=new Object(); 然后tmp.constructor=Func(); tmp.constructor();tmp.__proto__=Func.prototype; 最后返回tmp
js是面向对象,但我感觉这种面向对象是因为函数可以赋值,是个意外,不是最初的设计意图。所以没有类,但有prototype。
typeof(null)返回object,typeof(undefined)返回undefined
值 undefined 并不同于未定义的值。但是,typeof 运算符并不真正区分这两种值
typeof(null)返回object其实是个历史错误,但一直沿用了。。。
当函数无明确返回值时,返回的也是值 "undefined"
值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。alert(null == undefined);
尼玛。。。alert(NaN == NaN); //输出 "false"
所有对象都由Object继承而来
公有的属性:contructor/prototype等等
instanceof
引用对象的属性时,必须使用 this 关键字,否则会被认为是全局变量
使用对象的属性、方法时,先在当前实例上查找,没有的话接着查prototype,递归直至Object,可用于模拟继承机制
本地对象和宿主对象
Global和Math
函数
可以匿名
return不一定要返回值,没有返回值的话,实际返回undefined
可以赋给变量
可以用 arguments 对象检测函数的参数个数
ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数,遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略
模拟函数重载
闭包
运算符
+
===,关键在于是否需要类型转换
delete/void
语句
for(var key in json),遍历json,就是遍历对象
DOM
js可以操作所有html元素的结构、属性、样式、事件
很少直接用原生的js操作了
常用对象与方法
Number
parseInt/parseFloat/isNaN
String
for in 遍历
转义字符
substring/indexOf
自己写个StringBuffer
Date
可以直接比较
setTime/setDate myDate=setDate(myDate+5)
Array
for in 遍历
concat/join/sort
Boolean
js中的boolean判断有很多奇葩。比如数字0、空字符串、NaN、null、对象
Math
正则
可用于string对象的一些方法
消息框:3种
setTimeout
操作cookie
Function
toString/length
越来越觉得js设计有缺陷,各种概念杂糅在一起
有一些函数是全局的,不属于任意对象
BOM
比较常用的:location
一些以后可能用到的
http://www.w3school.com.cn/js/pro_js_primitivetypes.asp
http://www.w3school.com.cn/js/pro_js_typeconversion.asp
http://www.w3school.com.cn/js/pro_js_operators_boolean.asp
http://www.w3school.com.cn/js/pro_js_operators_equality.asp
js的对象模型
js的对象模型比较奇怪,不要太纠结
所有对象都可以认为是基于函数生成的,类似new Object()这样,Object()/Array()/String()这些都是函数;也可以从自定义函数生成对象。
但同时函数自己也是对象。我只能认为函数对象和普通的对象不同,是两种对象,js引擎有特殊处理,否则逻辑上会陷入循环,解释不通。
会陷入纠结:对象是用函数定义的,但函数也是对象,那函数对象是用哪个函数定义的。。。追溯下去,类似先有鸡还是先有蛋
原型链:普通对象->构造函数的prototype->Object.prototype
原型链:函数对象->Function.prototype->Object.prototype
收藏
0 条评论
下一页