JavaScript String 对象
手册地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String
使用常量定义字符串和使用new关键字定义字符的区别?
var str = new String("abc"); //表示创建一个对象, object类型 var str2 = "abc"; //创建一个字符串, string类型
典型问题:
var s1 = "abc"; //栈内存 var s2 = "abc"; //栈内存 var s3 = new String("abc"); var s4 = new String("abc"); s1===s2 //true 不作类型转换 s1===s3 //false s3===s4 //false s1==s2 //true s1==s3 //true s3==s4 //false; 堆内存当中,两个对象
字符串的常见截取方法
//获取第几个字符 charAt(index) //获取某个字符的ascii码 charCodeAt(index) //将ascii码转为字符 String.fromCharCode(97) //截取部分 substring(start,end) //分割字符串 split("-")
什么是ascii码?
每个计算机符号所对应的二进制的数字,总共有256个,(全球统一)
在ASCII基础之上扩展出来的更多的符号编码,诞生了字符集,例如:中文编码
ISO-8859-1
GBK
GB2312
为了解决各个国家由于扩展编码不统一的问题(无法交流),发明了unicode
也就是我们现在所使用的utf-8
-8 -16有什么区别??
utf-8相对于utf-16更节省空间
二进制 | 十进制 | 十六进制 | 缩写 | 可以显示的表示法 | 名称/意义 |
---|---|---|---|---|---|
0000 0000 | 0 | 00 | NUL | ␀ | 空字符(Null) |
0000 0001 | 1 | 01 | SOH | ␁ | 标题开始 |
0000 0010 | 2 | 02 | STX | ␂ | 本文开始 |
0000 0011 | 3 | 03 | ETX | ␃ | 本文结束 |
0000 0100 | 4 | 04 | EOT | ␄ | 传输结束 |
0000 0101 | 5 | 05 | ENQ | ␅ | 请求 |
0000 0110 | 6 | 06 | ACK | ␆ | 确认回应 |
0000 0111 | 7 | 07 | BEL | ␇ | 响铃 |
0000 1000 | 8 | 08 | BS | ␈ | 退格 |
0000 1001 | 9 | 09 | HT | ␉ | 水平定位符号 |
0000 1010 | 10 | 0A | LF | ␊ | 换行键 |
0000 1011 | 11 | 0B | VT | ␋ | 垂直定位符号 |
0000 1100 | 12 | 0C | FF | ␌ | 换页键 |
0000 1101 | 13 | 0D | CR | ␍ | 归位键 |
0000 1110 | 14 | 0E | SO | ␎ | 取消变换(Shift out) |
0000 1111 | 15 | 0F | SI | ␏ | 启用变换(Shift in) |
0001 0000 | 16 | 10 | DLE | ␐ | 跳出数据通讯 |
0001 0001 | 17 | 11 | DC1 | ␑ | 设备控制一(XON 启用软件速度控制) |
0001 0010 | 18 | 12 | DC2 | ␒ | 设备控制二 |
0001 0011 | 19 | 13 | DC3 | ␓ | 设备控制三(XOFF 停用软件速度控制) |
0001 0100 | 20 | 14 | DC4 | ␔ | 设备控制四 |
0001 0101 | 21 | 15 | NAK | ␕ | 确认失败回应 |
0001 0110 | 22 | 16 | SYN | ␖ | 同步用暂停 |
0001 0111 | 23 | 17 | ETB | ␗ | 区块传输结束 |
0001 1000 | 24 | 18 | CAN | ␘ | 取消 |
0001 1001 | 25 | 19 | EM | ␙ | 连接介质中断 |
0001 1010 | 26 | 1A | SUB | ␚ | 替换 |
0001 1011 | 27 | 1B | ESC | ␛ | 跳出 |
0001 1100 | 28 | 1C | FS | ␜ | 文件分割符 |
0001 1101 | 29 | 1D | GS | ␝ | 组群分隔符 |
0001 1110 | 30 | 1E | RS | ␞ | 记录分隔符 |
0001 1111 | 31 | 1F | US | ␟ | 单元分隔符 |
0111 1111 | 127 | 7F | DEL | ␡ | 删除 |
ASCII可显示字符
|
|
|
字符集是什么?
在ascii码基础之上扩展出来的符号标准, 不同国家的标准不一样,因此产生了各种各样的字符集
字符串替换(敏感词过滤) replace
replace(要替换的内容, 替换后的内容); //在不使用正则表达式时,无法进行全局替换,
也就是说,只能替换查找到的第一个目标
//使用正则做全局替换
var reg = new RegExp("图片","g"); //第二个参数g ,表示全局Global搜索的意思
str.replace(reg, "<img src='xxxx.jpg'/>");
注: replace()不会对原字符串做任何修改,而是生成新的字符串并返回
高级用法:
"2017&08@08".replace(/(\d+)(\D)/g, function(matched, sub1,sub2, index, str){ console.log(matched, sub1, sub2); return sub1+"-"; })
$是正则中的简略写法,代表()获取的块,$1~$9
match
console.log() 增加样式
console.log("%c 你好红色微软雅黑","color:red; font-size:20px; font-family:微软雅黑");
ASCII值的应用-------表单验证:
View Code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> </style> <script> window.onload=function(){ var _body=document.getElementById("_body"); _body.children[2].onclick=function(){ var content=_body.children[1].value; if(!isNaN(content.charAt(0)-0)) alert("不能以数字开头 !"); else if(content.length<6||content.length>20) alert("注册名的长度为6~20 !!"); else{ for(var i in content){ var char_= content.charCodeAt(i); var isNumber = char_ >= 48 && char_ <= 57; var isLetter = ( char_ >=65 && char_ <=90 ) || ( char_ >=97 && char_ <=122 ); var isUnderline= char_ == 95; if( !isNumber && !isLetter && !isUnderline){ alert("注册名只能包含数字、字母和下划线"); return; } } } } } </script> </head> <body id="_body"> <label for="input_">请输入注册名:</label><input id="input_" type="text" /> <input type="button" value="注册" /> </body> </html>
求一个字符串的字节数
//计算一个字符串的字节数 function countBytes(str, charset){ if(str && charset) { var count = 0; if(charset.toLowerCase() === "gbk"){ for(var i=0; i<str.length; i++){ var asc = str.charCodeAt(i); if(asc < 256){ count+=1; } else { count+=2; } } } else if(charset.toLowerCase() === "utf-16") { for(var i=0; i<str.length; i++){ var asc = str.charCodeAt(i); if(asc < 0xFFFF){ //65537 count+=2; } else { count+=4; } } } else if(charset.toLowerCase() === "utf-8") { for(var i=0; i<str.length; i++){ var asc = str.charCodeAt(i); if(asc <= 0x7F){ //127 count += 1; } else if(asc <= 0x7FF){ //2047 count += 2; } else if(asc <= 0xFFFF) { //65537 count += 3; } else { count += 4; } } } return count; } } //另外还有一种方法,可以计算JS在运行时,字符串的字节数,运行时是UTF-8标准,存储时字符集可以随意设定。 function countBytesRuning(str){ return new Blob([str]).size; }
match + 正则表达式 应用:JQuery选择器模拟
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="one"></div> <div class="two"></div> <div class="two"></div> <div class="two" index=8></div> </body> <script type="text/javascript"> function $(selector) { if(selector == undefined) return; var matched = null; //#id :id选择器,以#号开头 //规则:以#号开头,后跟1到任意个字符 if(matched = selector.match(/^\#(.+)/)) { return document.getElementById(matched[1]); } //.class : class选择器,以.开头 //规则:以.号开头,后跟1到任意个字符 if(matched = selector.match(/^\.(.+)/)) { return Array.from(document.getElementsByClassName(matched[1])); } //div :标签选择器,不以# .开头 //规则:不以. #号开头,由1到任意个字符(字母或数字0-9a-zA-Z)组成 if(matched = selector.match(/^[^\.\#]([0-9a-zA-Z]+)$/)) { return Array.from(document.getElementsByTagName(matched[0])); } //div[index=8] :属性选择器 //规则:以1到任意字符(字母或数字0-9a-zA-Z)开头,[,属性名由以1到任意字符(字母或数字0-9a-zA-Z_-)组成, //=,属性值以1到任意字符(字母或数字0-9a-zA-Z)组成,以]结尾 if(matched = selector.match(/^([^\.\#][0-9a-zA-Z]+)\[([0-9a-zA-Z\_\-]+)\=([0-9a-zA-Z]+)\]$/)) { var ele = matched[1]; var attrKey = matched[2]; var attrValue = matched[3]; var eles = Array.from(document.getElementsByTagName(ele)); var res = eles.filter(function(item, index, arr) { return item.getAttribute(attrKey) == attrValue; }); return res; } } console.log($("#one")); console.log($(".two")); console.log($("div")); console.log($("div[index=8]")); </script> </html>
随机验证码生成
function createCode(len) { var str = ""; for(var i = 0; i < len; i++) { var ascii = randomInt(48, 90); while(ascii >= 58 && ascii <= 64) { //随机结果不符合要求 ascii = randomInt(48, 90); } //console.log(ascii); str += String.fromCharCode(ascii); } return str; }
每两个字符前面加一个%,然后用 decodeURIComponent 转换就行了
function decodeHex(data) { if (data.length % 2) return ''; var tmp=''; for(i=0;i<data.length;i+=2) { tmp += '%' + data.charAt(i) + data.charAt(i+1); } var res = decodeURIComponent(tmp); return res; } alert(decodeHex('31303030317c323031383033323331343337313031323731303430303030303133317ce799bde5b08fe799bd7c32303139337ce5a5b3e5ad90e58d8ae7a88b7c30313a32343a31397ce7acace4b880e5908d7c62346336336336323131663434353463366266383733303531346635613734377ce7bab8e8b4b5e78988e69d837c7a696767757261742e636e'))
IE6、IE7 不支持用数组中括号取它的每一 个字符,需要用 charAt 来取;
IE6、IE7、IE8 不支持垂直分表符,因此有如下 hack。
var isIE678= !+"\v1" ;