高程三 基本包装类型部分的学习
基本上包含了我作为一个没有一点编程基础的弟弟在学这一章时遇到的各种脑壳痛的地方...
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
</head>
<body>
<script>
//用于操作基本类型值的特殊的引用类型:Boolean Number String
//实际上每读取一个基本类型值,后台就会创建一个对应的基本包装类型的对象,从而让我们调用一些方法操作这些数据
var s1 = "test";
var s2 = s1.substring(2);
//这里,s1是基本类型不是对象,从逻辑上来说它不应该有substring方法,但后台已经自动完成了一系列的处理。
//第二行代码访问s1时,其访问过程处于读取模式,在读取模式中访问字符串,后台会自动完成下列操作:
//1:创建string类型的一个实例(实例的基本包装类型的对象,是对象!) 2. 在实例上调用指定方法 3,销毁实例
console.log(s1,s2);//s1没有被销毁
//引用类型与基本包装类型的主要区别:对象的生存期
//用new操作符自主创建的引用类型的实例在执行流离开当前作用域之后才会被从内存中销毁
////自动创建的基本包装类型的对象则只存在于那行代码的执行瞬间,然后立即被销毁
//实例的解释:即类的实例,如果学过面向对象编程就很容易明白了
//function MyClass(){} (object和function都是引用类型)
//var m=new MyClass();//m就是MyClass的实例,MyClass是类,new就是创建操作符
//var obj = new Object(); obj即为Object的实例,也就是一个对象
s1.color = "red";
console.log(s1.color);//上一行创建的(基本包装类型)string对象 已经被销毁了
//实例都是对象,而对象不都是实例
//对基本包装类型的实例调用typeof会返回"object",所有基本包装类型的对象转换为布尔值时均为true
var str = new Object("text");//传入的是字符串,创建String的实例
document.write(str instanceof String);//String表示基本包装类型中的string
//在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,
//在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,
//它都返回 "object"。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。
//instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。
//与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。
var value = "100";
var num = Number(value);//转型函数
document.write(typeof num + "</br>");
var obj_num = new Number(value);//调用了基本包装类型的构造函数
document.write(typeof obj_num + "</br>");
//Boolean类型,与布尔值对应的引用类型
//布尔类型的实例重写了valueOf()方法,返回true/false,重写了tosting()方法,返回字符串的true/fasle
//原本的valueof()方法虽然也是返回true/false,但是返回的是布尔对象的原始布尔值
//基本包装类型和单体内置对象都是特殊的引用类型
var booleanobj = new Boolean(false);
document.write("booleanobj" + booleanobj.valueOf() + "</br>");//typeof instanceof属于操作符一类,用法和JavaScript的方法不同
//即便传入的参数是false,其布尔值也为true
//当作为一个构造函数(带有运算符 new)调用时,Boolean() 将把它的参数转换成一个布尔值,并且返回一个包含该值的 Boolean 对象。
// 如果作为一个函数(不带有运算符 new)调用时,Boolean() 只将把它的参数转换成一个原始的布尔值,并且返回这个值。
// 注释:如果省略 value 参数,或者设置为 0、-0、null、""、false、undefined 或 NaN,
//则该对象设置为 false。否则设置为 true(即使 value 参数是字符串 "false")。
var falseObj = new Boolean(false);
var re1 = falseObj && true; // 相当于true&&true,见行29注释
document.write( re1 + "</br>");
var vO1 = falseObj.valueOf();
document.write("vO1 " + vO1 + "</br>");//false
document.write(typeof falseObj + "</br>");//object 注意与行66对比
var falseValue = false;
var re2 = falseValue && true;//创建一个Boolean实例,在这个实例上调用制定方法,销毁这个实例
document.write( re2 + "</br>");
var vO2 = falseValue.valueOf();
document.write("vO2 " + vO2 + "</br>");//false
document.write(typeof falseValue + "</br>");//boolean
//!理解基本类型的布尔值与Boolean对象的区别和联系是很重要的
// &&运算符和数学上的逻辑运算符号不同:
// l && r
// 相当于:
// ToBoolean(l) ? r : l
// 即:
// 1). 先将“左值”转化为布尔值;
// 2). 如果这个布尔值为true,则返回“右值”,如果为false,则返回“左值”;
//attention: alert(Object)会隐形调用该对象的tostring()方法
//Number类型:调用Number构造函数时向其中传递相应数值来创建Number对象
//重写了方法:valueof() tostring() tolocalstring()
var num1 = 10.005;
document.write( num1.toFixed(2) + "</br>");//显示几位小数,并能自动四舍五入
document.write( num1.toExponential(1) + "</br>");//返回以指数表示法表示的数值形式,参数同样指定小数位数
//可以使用toPrecision()方法自动决定调用哪个方法
//string类型
var strobj = new String("abcdefg");
//其类型的每个实例都有一个length属性,注意,即使包含双字节字符,每个字符也只算一个字符
//字符方法:
document.write( strobj.charAt("0") + "</br>");//n
document.write( strobj.charCodeAt("1")+ "</br>");//115 返回字符编码
document.write( strobj[1]+ "</br>");//s
document.write( strobj.concat(" xixixi")+ "</br>");//连接字符串 不会影响原有字符串
//与接下来的三个方法一样都是返回基本类型的字符串值
document.write( strobj.slice(1,3)+ "</br>");//sn 会截到序号为3的前面一个
document.write( strobj.substring(1,3)+ "</br>");//sn
document.write( strobj.substr(1,3)+ "</br>");//snm 第二个参数指定的是返回字符串的长度
//第一个参数为负值时
document.write( strobj.slice(1,-3)+ "</br>");//会将负值加上字符串长度
document.write( strobj.substring(2,-3)+ "</br>");//会将负值转换为0,并且这个方法会自动由较小的数作为开始位置
document.write( strobj.substr(1,-1)+ "</br>");//会将第一个参数加上字符串长度,而第二个参数转换为0,即返回空字符串
//字符串位置方法(从字符串中查找子字符串)
document.write( strobj.indexOf("a")+ "</br>");//0,由前向后,
document.write( strobj.lastIndexOf("a")+ "</br>");//0,末尾向前,返回的序号也是由前向后排的!
//如果字符串只出现了一次,那么两个方法会返回相同的值
//两个方法都可添加第二个参数,从此参数指定的位置向后(前)搜索
//eg:通过循环调用indexOf()方法来找到所有匹配的子字符串
var longstr = "rfgdhuijjfgavkolperhtfjmcxjowelfhniruiretuhacbnxgychrfeiquqwerszztderynuiccvttbuomgy";
//写一个清除字符串中所有数字的方法
var pos = longstr.indexOf("j");
var store = "";
while(pos > -1){
store += " ";
store += pos;
pos = longstr.indexOf("j",pos+1);
}
for(pos;pos<longstr.length;pos++){
if(pos > -1){
store += " ";
store += pos;
console.log(pos);
pos = longstr.indexOf("j",pos);
}
}
// alert(store);
//你只会for循环吗弟弟
//trim()方法用于删除字符串(副本)中前置和后缀的空格
// longstr.toLocaleLowerCase()//针对特定地区的实现
// longstr.toLowerCase()
//RegExp类型 逃不掉的 给老子学
//通过RegExp类型来支持正则表达式
// var pattren = / pattren / flags
//pattern即为正则表达式,flags则为匹配模式
//g 全局模式 应用于所有字符串 i 不区分大小写 m 多行
var pat1 = /[bc]at/i;//匹配bat 或 cat
var pat1 = new RegExp("[bc]at","i");
var pat2 = /.at/gi;//匹配所有以at结尾的
var pat3 = /\[bc\]at/i;//匹配所有的[bc]at
var pat4 = /\.at/gi;//匹配所有的.at
//使用行137方法创建的正则表达式字面量会始终共享一个实例,而由构造函数创建的每一个RegExp实例都是一个新实例
//RegExp的每个实例都具有这些属性 global、ignorance、multiline,分别检查是否设置了模式,为布尔值
//lastIndex,整数,开始搜索下一个匹配项的字符位置,从0开始
//source,正则表达式的字符串表示,即字面量模式去掉//后的值
//字符串中的match方法
var text = "Harold on the way";
var pattren = /o/gi;
var matches = text.match(pattren);
console.log(matches.index);//0;在第几项找到
// matches[0];第一项是和整个模式匹配的字符串
// replace()方法,简化替换字符串的操作
// replace("at","ond");只会替换第一个
// replace(/at/g,"ond");会替换全部匹配
//spilt方法
//spilt(",",2); 将原数组中“,”两边的分开形成数组
//localecompare方法,比较字符串与字符串参数在字母表中的位置,分别返回-1,0,1(视具体实现而定)
// formCharCode()方法,将字符编码转换为字符串
</script>
</body>
</html>