百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

JS常用方法和一些封装:字符串、数组

bigegpt 2024-08-26 11:10 2 浏览

题外话

我始终认为,学习编程最好的方式就是去写,甭管写的怎样,也要去练习。

当初学完了数组,我记得自己是先把里面的每一个方法都敲了一遍,然后反复思考,通过这些方法,我能够做些什么?

很多语法我一开始也是很不理解的,然而在不断地运用过程中,慢慢地就开始明白过来了。只要抓住一个大方向,然后不断地练,就一定能深入理解!

正如国外一个有名的数学家所言,只有抓住了主树干,枝叶方面的细节便会奇迹般地丰富起来。

很多初学者,包括当年的我自己,总是觉得这个也要学,那个也要学,不敢直接去找工作,总想着全部学完了才行。可是呢,怎样算是个头呢,技术这东西日新月异。css3来了,一股脑儿跑去学css3,后来各种框架如雨后春笋般破土而出,ext.js,easy-ui,bootstrap,等等,面对各种各样的新框架,真的感觉时间不够。

其实,现在我个人感觉真不必这样,要知道,所有的js框架都是以js为源头,当自己js的功底足够牢固,那么就一切OK。我之前认识的一个朋友,从来没接触过bootstrap,后来公司要用,看了两三天直接就上手,用bootstrap来开发项目了。

js + css是根,真是如此的。

否则,你永远会觉得自己在学习,却不知道这样的目的是什么。所以,不管三七二十一,如果你现在还是一个处于迷茫求职阶段的毕业生,或者是刚培训完,那么,不用慌,先找一份工作干起来再说,在工作中慢慢积累。

不要害怕,觉得自己好多不懂,会不会有问题,真没关系的,不要企图把所有技术学完了再去找工作。

哈,闲话不多说,开始记录。

1.字符串相关

1.1 format方法

在各种编程语言中,字符串的format方法是比较常见的,以下通过js扩展的方式,实现了js版本的format方法。目前貌似还没有浏览器支持这一个方法。

if(!String.prototype.format ){

String.prototype.format = function() {

var e = arguments;

return this.replace(/{(\d+)}/g,function(t, n) {

return typeof e[n] != "undefined" ? e[n] : t;

})

};

}

例子:

var template = "今天的天气很{0},大家一起去{1}!";
alert(template.format("晴朗","郊游"));

效果:

2.数组相关

1.2 forEach(callback,context) 操作数组中的每一个元素

ie9以上的浏览器,以及其他非IE浏览器都支持这一方法。

以下是兼容性的扩展写法:

/**
 forEach除了接受一个必须的回调函数参数,还可以接受一个可选的上下文参数(改变回调函数里面的this指向)(第2个参数)。
*/
if (!Array.prototype.forEach && typeof Array.prototype.forEach !== "function") {
 Array.prototype.forEach = function(callback, context) {
 // 遍历数组,在每一项上调用回调函数,这里使用原生方法验证数组。
 if (Object.prototype.toString.call(this) === "[object Array]") {
 var i,len;
 //遍历该数组所有的元素
 for (i = 0, len = this.length; i < len; i++) {
 if (typeof callback === "function" && Object.prototype.hasOwnProperty.call(this, i)) {
 if (callback.call(context, this[i], i, this) === false) {
 break; // or return;
 }
 }
 }
 }
 };
}

例子:

var drinks = ['雪碧','可乐','脉动','红牛','农夫山泉'];
 
var context = {
 str1 : '【',
 str2 : '】'
};
 
drinks.forEach(function(item){
 console.log(this.str1 + item + this.str2);
},context);

效果:

这个方法在各大浏览器都得到了较好的支持。

1.3 indexOf(searchvalue,fromindex) 查询数组中某一个值的下标

ie9以上的浏览器,以及其他非IE浏览器都支持这一方法。以下是兼容性的扩展写法:

//获取某元素在数组中第一次出现的下标
if (!Array.prototype.indexOf) {
 Array.prototype.indexOf = function(searchElement, fromIndex) {
 var k;
 // 1. Let O be the result of calling ToObject passing
 // the this value as the argument.
 if (this == null) {
 throw new TypeError('"this" is null or not defined');
 }
 var O = Object(this);
 // 2. Let lenValue be the result of calling the Get
 // internal method of O with the argument "length".
 // 3. Let len be ToUint32(lenValue).
 var len = O.length >>> 0;
 // 4. If len is 0, return -1.
 if (len === 0) {
 return -1;
 }
 // 5. If argument fromIndex was passed let n be
 // ToInteger(fromIndex); else let n be 0.
 var n = +fromIndex || 0;
 if (Math.abs(n) === Infinity) {
 n = 0;
 }
 // 6. If n >= len, return -1.
 if (n >= len) {
 return -1;
 }
 // 7. If n >= 0, then Let k be n.
 // 8. Else, n<0, Let k be len - abs(n).
 // If k is less than 0, then let k be 0.
 k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 // 9. Repeat, while k < len
 while (k < len) {
 // a. Let Pk be ToString(k).
 // This is implicit for LHS operands of the in operator
 // b. Let kPresent be the result of calling the
 // HasProperty internal method of O with argument Pk.
 // This step can be combined with c
 // c. If kPresent is true, then
 // i. Let elementK be the result of calling the Get
 // internal method of O with the argument ToString(k).
 // ii. Let same be the result of applying the
 // Strict Equality Comparison Algorithm to
 // searchElement and elementK.
 // iii. If same is true, return k.
 if (k in O && O[k] === searchElement) {
 return k;
 }
 k++;
 }
 return -1;
 };
 }

例子:

var index = drinks.indexOf('雪碧');
alert(index);//0

类似的还有lastIndexOf,用于获取数组中某个元素最后一次出现的位置。如果数组没有这个元素,则返回-1。顺便贴上该方法的实现:

//获取某元素在数组中最后一次出现的下标
if (!Array.prototype.lastIndexOf) {
 Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {
 'use strict';
 if (this === void 0 || this === null) {
 throw new TypeError();
 }
 var n, k,
 t = Object(this),
 len = t.length >>> 0;
 if (len === 0) {
 return -1;
 }
 n = len - 1;
 if (arguments.length > 1) {
 n = Number(arguments[1]);
 if (n != n) {
 n = 0;
 }
 else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
 n = (n > 0 || -1) * Math.floor(Math.abs(n));
 }
 }
 for (k = n >= 0
 ? Math.min(n, len - 1)
 : len - Math.abs(n); k >= 0; k--) {
 if (k in t && t[k] === searchElement) {
 return k;
 }
 }
 return -1;
 };
}

通过这两个方法,我们可以来做一些有意思的事情了。

比如,判断一个对象是否为数组?

IE9 以上的浏览器,已经支持通过Array.isArray()来验证一个对象是否为数组了。

比如:

var result = Array.isArray([]);
alert(typeof []);//object
alert(result); //true

那么,如果我们自己来实现,又该如何做呢?下面给出一个简单思路,简单模拟一下这个过程:

//首先,让我们来看一看数组的构造器是咋样的?
console.log([].constructor.toString());
/*
 打印出来是这样的:
 function Array() { [native code] }
*/

于是乎。。。

var Array = function(){
}
Array.isArray = function(obj){
 return obj.constructor.toString().indexOf('Array') != -1;
}
var result = Array.isArray([]); 
alert(result); //true

虽然取巧了点,不过目的确实达到了。

数组封装

通过数组的一些基本方法,我们可以开始自己模拟一下java中的ArrayList了,话不多说,贴上代码:

//模拟ArrayList
function ArrayList(){
 var arr = []; //用于保存数据的数组
 var length = 0; //数组的长度,默认为0
 
 /**
 * 判断是否为空
 */
 this.isEmpty = function(){
 return length == 0;
 }
 
 /**
 * 获取列表长度
 */
 
 this.size = function(){
 return length;
 }
 
 /** 
 * 判断对象中是否包含给定对象
 */ 
 this.contains = function(obj){
 if(arr.indexOf(obj) != -1){
 return true;
 }
 return false;
 }
 
 /** 
 * 新增
 */
 this.add = function(obj){
 length = length + 1;
 arr.push(obj);
 }
 
 /**
 * 删除
 * 参数1 obj : 需要删除的元素
 * 参数2 deleteAll: 是否全部删除,否则默认删除第一个匹配项
 */
 this.remove = function(obj,deleteAll){
 var len = arr.length;
 for(var i = 0 ;i < len ;i++){
 if(arr[i] == obj){
 arr.splice(i,1);
 length = length - 1;
 if(!deleteAll){
 break;
 }
 }
 }
 }
 
 
 /**
 * 根据索引获取对应的元素
 */
 this.get = function(index){
 if(index > length - 1){
 return null;
 }
 return arr[index];
 }
 
 /**
 * 获取列表数组
 */
 this.toArray = function(){
 return arr;
 }
 
 /**
 * 获取某一个元素的角标
 * 如果只出现一次,就返回一个数字,如果大于一次,就返回数组
 */
 this.indexOf = function(obj){
 var rstArr = [];
 var count = 0;
 for(var i = 0 ;i < length ;i++){
 if(obj == arr[i]){
 rstArr[count++] = i;
 }
 }
 if(count == 1){
 return rstArr[0];
 }
 return rstArr;
 }
 
 this.toString = function(){
 return arr.toString(); 
 }
}
//测试代码
var list = new ArrayList();
list.add('张三');
list.add('李四');
list.add('王五');
list.add('赵六');
list.add('王五');
console.log(list.size());
console.log(list.toString());
console.log(list.contains('张三'));
list.remove('王五',true); //null,undefined,''
console.log(list.toString());
console.log(list.get(0));
console.log(list.get(1));
console.log(list.get(2));
console.log(list.size());
console.log(list.toArray());
list.add('张三');
list.add('张三');
console.log(list.toArray());
console.log(list.indexOf('张三'));
console.log(list.indexOf('赵六'));

运行结果:

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...