JavaScript琐碎知识点
近日查漏补缺复习js的相关东西时,将一些易遗忘的基本概念的相关知识进行了整理,如下:
1. typeof 可用于返回一个对象的类型。如:
typeof "John" (返回String)
typeof 3.14 (返回number)
typeof [3,11,9,7,8,16] (返回object)
2. null与undefined 值相同,类型不同。两者都为 值为空未设置值的意思
日常使用中,null用于对象,undefined用于变量、属性和方法。
null == undefined 返回true
null === undefined 返回false
另外,一个对象之后再定义后才能判断它是否为null,在没有定义它之前,它会是undefined.
例如,我们想判断一个对象是否为null 应首先判断时候定义: if(typeof obj !== "undefined" && obj !== null)
3. constructor属性可以返回对象的构造函数
"john".constructor 返回String()
(3.14).constructor 返回Number()
4. 类型转换相关
一个变量var number = 176; 如果想让176变成字符串可以 number = 176 + " " ; 这种方法类似Java中的字符串拼接。
也可以使用 String(number) 这种方法 它会返回字符串类型的number.
使用最多且最好的办法是 number.toString()
boolean 和 Date 等类型的 对象 也适用这些方法
parseInt() 方法使字符串转换为数字,大部分时候我们使用这种方法。
如 var num = parseInt("123");
我们也可以用 var num = Number("123");
parseFloat()使用方法和parseInt()类似
另外:
对boolean类型进行转换 Number(false) 返回0
Number(true) 返回1
对日期进行转换 var d = new Date();
Number(d) 将会返回时间戳 (和d.getTime()类似 都会返回时间戳)
自动转换,在进行非同一类型的运算操作时会被自动转换,例如:
5 + null 返回5,null自动转换为0
"5" + null 返回"5null"
"5" + 1 返回"51", 1被转换为 "1"
"5" - 1 返回4, "5" 被转换 为 5
如果我们尝试通过innerHTML去输出一个对象或变量时JavaScript会自动调用toString()方法去把数据转换为字符串,但如果是数组等类型无法直接显示其数据的会被转换为"object object"
6. toPrecision(x) 方法
它可以指定一个number的长度。 例如:
var num = 13.3714;
var leth = num.toPrecision(3); 那么 leth 的值将会是13.3 因为参数3 规定了会返回num的3位数值, 无论是否有小数点。
7. JS正则表达式
一般情况下正则表达式使用两种字符串的方法:search()和replace()
search()可以检索一个字符串中指定的字符串或者与正则表达式匹配的子字符串,它会返回子串的起始位置。
replace()可以在一个字符串中用一些字符替换另一些字符,或者替换一个与正则表达式匹配的字符。
例:
search():
var str = "JavaScript Jquery ";
var num = str.search(/va/i); 则num会接到search()的返回值 2 ,因为va在str中从下标2开始; 如果找不到va 则返回-1
如果search()不适用正则表达式,则直接将字符串放入参数即可 search(str);
replace():
var str = "JavaScript Jquery";
str = str.replace("/Jquery/i", "Oracle"); 则str 中的Jquery被替换为Oracle
不使用正则表达式的形式为:str.replace("Jquery","Oracle");
/params/i 此正则表达式中,i意为不区分大小写, 此参数还可写为 g、m。
/params/g 意为全局匹配。 一般匹配中,比如上方的search(),在查找到一个匹配的值后就会停止检索,而参数g不会
/params/m 意为执行多行匹配
正则表达式中的RegExp对象:
RegExp对象是封装了属性和方法的正则表达式对象。
如 test()方法和exec()方法。
test()方法会判断一个字符串是否匹配某个模式, 因为是判断,所以它会返回true或者false.
例:
var patt = /e/;
patt.test("abcdefg"); 则会返回 true, 因为test的参数里包含着 e
/e/.test("abcdefg"); 也可以为这种写法
exec()方法会检索字符串中是否包含正则表达式的匹配,包含的话返回这个值,否则返回null.
例:
var patt = new RegExp("test");
patt.exec("This is test code."); 则返回 test, 如果没有则返回null
8. JS异常
在使用try/catch由JavaScript引擎抛出的异常时,catch中需要用 .message 去接收错误信息。
如果使用throw抛出异常,则直接使用异常信息即可
例如:
try{
alerttttt("弹框"); //alert写错
} catch(err) {
alert("异常信息:" + err.message);
}
// 使用throw 抛出异常
try{
if(x > 10 ) throw "x 数值过大";
} catch (err) {
alert("异常信息:" + err);
}
9. JS变量提升
JavaScript支持一个变量先去使用然后再去声明它,这种特性得益于 hoisting(变量提升),因为函数和变量的声明总会被JS的解释器悄悄"提升"到方法体的最上方。
例:
x = 5;
alert(x);
var x;
需要注意的是,如上代码,变量提升指的是声明变量的代码会被提升,也就是说var x; 被提升。但是初始化操作不会被提升,比如最后一句改为var x = 7; 那么在提升时仍然会将var x 提升 初始化的 = 7 不会被提升, alert仍将弹出 5.
当然,未声明 先使用 这种特性只能在非严格模式中出现。
10. 严格模式
严格模式下,JS将会在严格的条件下运行,此时不允许 如 未声明 先使用 等类似的不严谨的代码。
声明严格模式,需要在脚本或者函数的头部添加 "use strict"; 注意需要双引号
声明的 严格模式存在作用域,如声明在某个函数中,那么这个函数将会是严格模式下运行
<script>
a = 1; //声明严格模式前,js将以非严格模式去执行代码,所以此处不会报错
function fuc() {
"use strict"; //声明严格模式
b = 2; // 报错 (b 未定义)
}
</script>
"use strict" 可以直接声明在function上方,那么它将会是全局作用。如果它只声明在某个function,那么它也会仅仅作用在这个函数内部。
11. 某些潜在问题
关于switch(x) switch的参数(比如x),在选择case时做的是 === 比较,意为 值和类型都必须相同
关于 浮点类型:
var x = 0.1;
var y = 0.2;
var z = x + y;
alert(z == 0.3); //最终将弹出 false 因为JS中的所有数据都是以64位浮点型来存储
所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定
如果打印上方 Z 的值,你会发现它等于 0.30000000000000004
JS允许我们使用断行语句如:
function myFunc(){
var x =
"hello world";
//这种形式将不会被允许
var y = "hello
world";
//如果想要这样,可以在 hello 后 空格 加上 \ 即可
}
12. required属性
required用于标签中的必录项校验,以 required="required" 形式放置在标签中,根据浏览器不同会显示不同的非空提示信息 (不支持 <= IE9)
13. JSON
Json的全称为 JavaScript Object Notation.
Json使用了JavaScript的语法,但它是独立的语言。
JSON.parse(param); 用于将一个Json转换为JS对象。
下面代码中,如果我们想获得jsonObj的name, 那么 jsonObj.name 即可
var jsonObj = {
p1 : 1,
p2 : 'hi json',
p3 : 'hello',
p4 : 2.1,
name : 'Peter',
age : 21
}
14. href="#" 与 javascript:void(0)
#包含了位置信息,其实默认的值为#top, 而后者是一个死链接,点击a标签后不会有任何反应
15. JavaScript中,代码规范首行要缩进四个字符,但是一般情况下不推荐用TAB键,尽管它很方便,但是每个编辑器对Tab的解析不一样,你不能保证它永远不会出现问题。
16. JavaScript函数构造器
function用于声明一个函数。我们也可以通过函数构造器Function()去定义一个函数.
var myFunction = new Function("a","b","return a * b");
var sum = myFunction(3,4);
则sum接受值的是 12
关于函数构造器和js对象 推荐博客: javascript对象初探(一)--- 构造器函数
17. 函数自调用
往往我们声明一个函数后需要去调用它,函数才会开始执行。如果我们想让它在加载时自动执行的话,可以这样写:
(function (){
alert("ok!");
}
)() //用()将整个函数包围起来,然后再跟上一个()
18. 函数也是对象
顾名思义,函数同样拥有属性和自己的方法,例如 arguments和toString().
arguments.length可返回函数的参数个数。 arguments为 函数的参数数组。
toString()可以将整个function转换成一个字符串返回
function funcOne(a,b,c){
}
var num = funcOne.arguments.length; //则num = 3;
19. 如果一个函数的参数未被传值,那么它的默认值则为undefined, 我们可以自己给它设定一个默认值 如下:
function jump(x,y){ if(y == undefined){ y = 2; } }
jump(x); |
更为简单的写法:
function jump(x,y){ y = y || 2; } jump(x);
|
20. 关于函数的预定义方法call()和apply()
apply可将一个数组 作为对应的参数传入函数中
function change(a,b,c,d,e,f,g){ return a * b * c * d * e * f * g; } var myArray=[1,2,3,4,5,6,7]; var myObject = change.apply(myObject,myArray); //如果不需要返回值则可写成如下方式 change.apply(this,myArray);
|
//另外一种方式 function change(a,b,c,d,e,f,g){ return .......; } var myObject = change.call(myObject, 1,2,3,4,5,6,7 );
|
21. JS DOM相关
var arr = document.getElementsByTagName("p");
返回标签p的对象,如果存在多个标签p, 则arr为一个数组,通过arr[0]的方式获得元素
上一篇: JS事件对象event
下一篇: 事件对象event