资讯专栏INFORMATION COLUMN

学习笔记: JS字符串

CastlePeaK / 3446人阅读

摘要:我们在中操作字符串,往往是将它转换为数组,再操作,如字符串的反转字符串常用的一些方法判断一个字符串是否以某个字符串开头返回在字符串中首次出现的位置从位置开始查找,如果不存在,则返回。如果则查找整个字符串如同传进了。

我们在js中操作字符串,往往是将它转换为数组,再操作,如:

split("").reverse().join("")
字符串的反转

MDN

js字符串常用的一些方法 判断一个字符串是否以某个字符串开头

str.indexOf(substr[, start]) => 返回 substr 在字符串 str 中首次出现的位置,从 start 位置开始查找,如果不存在,则返回 -1。

start可以是任意整数,默认值为 0。如果 start < 0 则查找整个字符串(如同传进了 0)。如果 start >= str.length,则该方法返回 -1,除非被查找的字符串是一个空字符串,此时返回 str.length

 var str = "JavaScript";
    str.indexOf("av");   // 1
    str.indexOf("av",2); // -1
    str.indexOf("",11);  // 10
    str.indexOf("",8);   // 8

str.includes(substr[, start]) => ES6方法判断 substr 是否被包含在 str 中,如果是返回true,否则返回false

var str = "To be, or not to be, that is the question.";

 
 str.includes("To be");     // true
 str.includes("To be", 1);  // false
 str.includes("TO BE");     // false

str.startsWith(substr[, start]) => ES6方法判断 str 是否是以 substr “开头”的,如果是返回true,否则返回false

var str = "To be, or not to be, that is the question.";

str.startsWith("To be");         // true
str.startsWith("not to be");     // false
str.startsWith("not to be", 10); // true
toSting 和 valueOf

所有对象继承了这两个转换方法
toString: 返回一个反映这个对象的字符串
valueOf: 返回它相应的原始值

toString

var arr = [1,2,3]
var obj = {
    a: 1,
    b: 2
}
console.log(arr.toString()) // => 1,2,3
console.log(obj.toString()) // => [object Object]
// 那我们修改一下它原型上的 toString 方法呢
Array.prototype.toString = function(){ return 123 }
Object.prototype.toString = function(){ return 456 }
console.log(arr.toString()) // => 123
console.log(obj.toString()) // => 456

// 我们看下其余类型转换出来的结果, 基本都是转换成了字符串
console.log((new Date).toString()) // => Mon Feb 05 2018 17:45:47 GMT+0800 (中国标准时间)
console.log(/d+/g.toString()) // => "/d+/g"
console.log((new RegExp("asdad", "ig")).toString()) // => "/asdad/gi"
console.log(true.toString()) // => "true"
console.log(false.toString()) // => "false"
console.log(function(){console.log(1)}.toString()) // => "function (){console.log(1)}"
console.log(Math.random().toString()) // => "0.2609205380591437"


valueOf

var arr = [1,2,3]
var obj = {
    a: 1,
    b: 2
}
console.log(arr.valueOf()) // => [1, 2, 3]
console.log(obj.valueOf()) // => {a: 1, b: 2}
// 证明valueOf返回的是自身的原始值
// 同样我们修改下 valueOf 方法

Array.prototype.valueOf = function(){ return 123 }
Object.prototype.valueOf = function(){ return 456 }
console.log(arr.valueOf()) // => 123
console.log(obj.valueOf()) // => 456

// valueOf转化出来的基本都是原始值,复杂数据类型Object返回都是本身,除了Date 返回的是时间戳
console.log((new Date).valueOf()) // => 1517824550394  //返回的并不是字符串的世界时间了,而是时间戳
console.log(/d+/g.valueOf()) // => 456  当我们不设置时valueOf时,正常返回的正则表式本身:/d+/g,只是我们设置了 Object.prototype.valueOf 所以返回的时:456
console.log(Math.valueOf()) // => 456 同上
console.log(function(){console.log(1)}.valueOf()) // => 456 同上 
toString 和 valueOf 实例

1.

var a = {
    toString: function() {
        console.log("你调用了a的toString函数")
        return 8
    }
}
console.log( ++a) 
// 你调用了a的toString函数 
// 9  
// 当你设置了 toString 方法, 没有设置 valueOf 方法时,会调用toString方法,无视valueOf方法

2.

var a = {
    num: 10,
    toString: function() {
        console.log("你调用了a的toString函数")
        return 8
    },
    valueOf: function() {
        console.log("你调用了a的valueOf函数")
        return this.num
    }
}
console.log( ++a) 
// 你调用了a的valueOf函数
// 11
// 而当你两者都设置了的时候,会优先取valueOf方法, 不会执行toString方法
字符串模板 es5中

引入lodash库的_.template()

// Use the "interpolate" delimiter to create a compiled template.
var compiled = _.template("hello <%= user %>!");
compiled({ "user": "fred" });
// => "hello fred!"
es6

驼峰化一个连字符连接的字符串
/**
 * Camelize a hyphen-delimited string.//驼峰化一个连字符连接的字符串
 */
var camelizeRE = /-(w)/g;
var camelize = cached(function (str) {
  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ‘‘; })
});

/**
 * Capitalize a string.//对一个字符串首字母大写
 */
var capitalize = cached(function (str) {
  return str.charAt(0).toUpperCase() + str.slice(1)//把第一个字符串的首个字符大写,把除第一个字符的字符串返回与大写的首字符拼接
});

/**
 * Hyphenate a camelCase string.用字符号连接一个驼峰的字符串
 */
var hyphenateRE = /([^-])([A-Z])/g;
var hyphenate = cached(function (str) {
  return str
    .replace(hyphenateRE, ‘$1-$2‘)//$1为正则表达式匹配的第一个元素$2为第二个元素
    .replace(hyphenateRE, ‘$1-$2‘)
    .toLowerCase()//使之最小化
});
/**
 * Check if a string starts with $ or _
 */
function isReserved (str) {
  var c = (str + "").charCodeAt(0)
  return c === 0x24 || c === 0x5f
}

string to array

repeat

判断字符串是否以 $ 或 _ 开头

参考

《JavaScript经典实例》
js 基础总结(常用的反转)
vue源码解析

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83194.html

相关文章

  • JS笔记二:JS历史、数据类型、for in遍历对象、typeof的BUG

    摘要:学习笔记二个人学习笔记参考阮一峰的教学学习笔记二是对学习笔记一的补充历史是标准新增特性汇总方应航知乎专栏个小变化新增特性汇总方应航知乎专栏以后一年一次只增加了两个特性只增加了个特性功能最多数据类型补充字符串多行字符串新特性多行字符串 JavaScript学习笔记二 个人学习笔记 参考阮一峰的JavaScript教学 学习笔记二是对学习笔记一的补充 JavaScript历史 sho...

    mrcode 评论0 收藏0
  • JS实现KeyboardNav(学习笔记)一

    摘要:取正值时,阴影扩大取负值时,阴影收缩。默认为,此时阴影与元素同样大。如果没有指定,则由浏览器决定通常是的值,不过目前取透明。 纯JS实现KeyboardNav(学习笔记)一 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 GitHub项目源码 预览地址 最终效果 showImg(https://sfault-image.b0.upaiyun.com/...

    source 评论0 收藏0
  • JS实现KeyboardNav(学习笔记)一

    摘要:取正值时,阴影扩大取负值时,阴影收缩。默认为,此时阴影与元素同样大。如果没有指定,则由浏览器决定通常是的值,不过目前取透明。 纯JS实现KeyboardNav(学习笔记)一 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 GitHub项目源码 预览地址 最终效果 showImg(https://sfault-image.b0.upaiyun.com/...

    lscho 评论0 收藏0
  • angularjs学习笔记——使用requirejs动态注入控制器

    摘要:最近一段时间在学习,由于觉得直接使用它需要加载很多的文件,因此想使用来实现异步加载,并动态注入控制器。手动启动,特别说明此处的不是那个框架,而是的一个手动启动框架的函数中完成了各模块的初始化,并且引入了。 最近一段时间在学习angularjs,由于觉得直接使用它需要加载很多的js文件,因此想使用requirejs来实现异步加载,并动态注入控制器。简单搜索了下发现好多教程写的都很复杂,所...

    王军 评论0 收藏0
  • JS正则表达式学习笔记2

    摘要:第二阶段该部分内容是学习正则的第二篇内容,点击第一部分查看第一部分的内容。 第二阶段 该部分内容是学习正则的第二篇内容,点击第一部分查看第一部分的内容。 这部分学习的内容包括: 分组 断言 匹配模式(贪婪和懒惰) 分组 我们可以通过量词匹配一个字符多次,但是如果我们想要匹配多个字符多次,就需要用到分组,比如下面一个例子 // 匹配字母和数字连续出现三次的字符 let str = a...

    Ajian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<