Array.prototype.slice.call()方法详解

2023-10-26

  • slice:用来截取截取字符串方法
  • Array: javascript的一个引用类型,其原型prototype上有一个方法叫slice
  • call和apply : 用来改变对象中函数内部的this引用,使得函数可以随便换‘妈妈’

为什么不直接用 arguments.slice(1)呢 不是一样的么?

答案是不一样。

Array.prototype.slice.call(arguments, 1)可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。要是直接写arguments.slice(1)会报错。

arguments 是object 不是Array ,他的原型上没有slice方法

原理:

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组

var a={length:2,0:'first',1:'second'};//类数组,有length属性,长度为2,第0个是first,第1个是second
console.log(Array.prototype.slice.call(a,0));// ["first", "second"],调用数组的slice(0);

var a={length:2,0:'first',1:'second'};
console.log(Array.prototype.slice.call(a,1));//["second"],调用数组的slice(1);

var a={0:'first',1:'second'};//去掉length属性,返回一个空数组
console.log(Array.prototype.slice.call(a,0));//[]

function test(){
  console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0)
  console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1)
}
test("a","b","c");

将函数的实际参数转换成数组的方法:

1、

var args = Array.prototype.slice.call(arguments);

2、

var args = []; 
for (var i = 1; i < arguments.length; i++) { 
    args.push(arguments[i]);
}

 3、

var toArray = function(s){
    try{
        return Array.prototype.slice.call(s);
    } catch(e){
        var arr = [];
        for(var i = 0,len = s.length; i < len; i++){
            //arr.push(s[i]);
               arr[i] = s[i];  //据说这样比push快
        }
         return arr;
    }
}

将函数的实际参数转换成数组的方法的实际应用:

表单申请时,upload组件上传多张图片时候,能够左右切换预览所有上传的图片;

表单申请后,打开upload组件也能够预览多张图片

 

代码如下


import Viewer from "viewerjs";
预览组件的版本号:"viewerjs": "^1.10.5",

 /**关闭图片 */
  handleCancel = () => this.setState({ previewVisible: false });
  /**处理图片 */
  handlePreview = async (file: UploadFile, className: string) => {
    if (!file.url && !file.preview) {
      file.preview = await getBase64(file.originFileObj as Blob) as string;
    }
    if ([".pdf", ".docx", ".doc"].some(i => file.response?.data.replace(/\s/g, "")?.includes(i)) || [".pdf", ".docx", ".doc"].some(i => file.url?.replace(/\s/g, "")?.includes(i))) {
      this.setState({
        previewImage: file?.url || file?.preview as string,
        previewVisible: true,
        fileUrl: file.response?.data.replace(/\s/g, ""),
      });
    } else {
      const dom = document.querySelector(`.${className} .ant-upload-list`);
      const url = file.url || file.thumbUrl || file.preview;
      const domSrcList = Array.prototype.slice.call(document.querySelectorAll(`.${className} .ant-upload-list img`)).map(i => i.src);
      if (dom) {
        const gallery = new Viewer(dom as HTMLElement, {
          initialViewIndex: domSrcList.indexOf(url) !== -1 ? domSrcList.indexOf(url) : 0,
          hidden: () => {
            gallery.destroy();
          },
        });
        gallery.show();
      }
    }
  }


 /** 处理上传 */
  handleChange = async (data: UploadChangeParam<UploadFile<any>>) => {
    const fun = () => {
      if (data.file.response) {
        if (data.file.response.data) {
          for (let i of data.fileList) {
            if (i.thumbUrl?.includes("base64")) {
              i.thumbUrl = i.response?.data || i.thumbUrl;
            }
          }
        }
      }
    }
    fun();
  }



render() {

<div className="clearfix sycnssmj">
            <Form.Item>
              {getFieldDecorator("sycnssmj", {
                valuePropName: "sycnssmj",
                getValueFromEvent: (e: UploadChangeParam) => {
                  return e.fileList;
                },
                rules: [
                  {
                    required: checkType ? true : false,
                    message: "文件必须上传!",
                  },
                  { validator: checkedUploadSuccess },
                ],
                initialValue: defaultValue && [...fileListFun(defaultValue.sycnssmj as File[])],
              })(<Upload
                accept="image/*,.pdf,.docx"
                key={JSON.stringify(defaultValue && [...fileListFun(defaultValue.sycnssmj as File[])])}
                defaultFileList={defaultValue && [...fileListFun(defaultValue.sycnssmj as File[])]}
                name="file"
                multiple
                transformFile={transformFile}
                listType="picture"
                action={`${window.config.backEnd}/api/v1/business/file/upload`}
                method="POST"
                headers={{
                  Authorization: users && `Bearer ${users.access_token}`,
                }}
                disabled={globelDisable}
                onPreview={(file) => this.handlePreview(file, "sycnssmj")}
                onChange={this.handleChange}
              >
                {globelDisable ? null : <FileButton>{uploadButton}</FileButton>}
              </Upload>)}
            </Form.Item>
          </div>

}

预览

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Array.prototype.slice.call()方法详解 的相关文章

随机推荐

  • 分布式的登录如何实现的

    1 单机登录 user在server上输入用户名密码等 完成用户信息校验并将对应的信息写入server的session中 2 分布式框架的登录方案 使用redis 即通过key value的方式 在server1完成登录后 将用户信息以va
  • 润和HCIP认证套件的烧写问题的终极解决方案

    目录 问题的由来 烧写问题 启动问题 总结 问题的由来 润和HarmonyOS鸿蒙开发板 HiSpark AI Camera开发套件 下图 是OpenHarmony的小型设备和标准设备的代表 基于华为海思Hi3516DV300芯片 支持Li
  • VMware下,私有云平台的配置(CentOS 7系统,含桌面)

    文章目录 实验环境 Windows系统 VMWare 15 1 0 CentOS 7 x86 64 Minimal 1810 iso映像文件 1 安装CentOS系统 2 实现远程桌面连接 实验环境 Windows系统 VMWare 15
  • Tensorflow入门--用tensorflow实现一个三层的神经网络

    前言 这段时间在学习吴恩达的深度学习视频 前面博客中一直在利用numpy自己构造网络框架实现前向传播 损失函数 反向传播 优化等 在这一篇博客中将实现利用tensorflow库里的函数直接实现上面所说的功能 使整个程序更加简洁 最后 如果有
  • 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI

    汉诺塔 汉诺塔II hdu1207 先说汉若塔I 经典汉若塔问题 有三塔 A塔从小到大从上至下放有N个盘子 如今要搬到目标C上 规则小的必需放在大的上面 每次搬一个 求最小步数 这个问题简单 DP a n a n 1 1 a n 1 先把
  • HTML(的简单表格)的案例

    1 简单的表格 代码 table border 2 width 400px height 200px align center cellspacing 10 cellpadding 0px tr align right valign top
  • 【ML】XGBoost 算法:愿它统治万岁!

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • css使用行内注释报错_在CSS中使用注释

    css使用行内注释报错 It is a very good working practice to comment your code in CSS Comments serve two major functions 在CSS中注释您的代
  • uniapp组件深度修改样式问题

    问题一 样式类型scss less css 如果公共样式为common scss 对应的App vue文件必须加上lang scss 问题二 深入修改样式 当前页面修改 带scoped css样式
  • 系统安装部署系列教程(四):制作PE系统

    Win PE全程叫做Windows预安装系统 是Windows系统运行所必须的所有组件的最小集合 可能这么说大家感觉比较绕 简单来说 PE系统就是用来安装和修复系统的工具系统 最主要的作用就是用来重装系统 当然PE系统的作用并不是仅仅用来重
  • 【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)

    需要源码和资源包请点赞关注收藏后评论区留言私信 一 效果演示 如下图所示 飞机拆装后 单击零件 将会出现零件说明功能 看上去十分有科技感和美观 演示视频如下 零件高亮及显示说明 二 实现步骤 首先双击打开Level6 UI场景 接下来的步骤
  • 项目上线质量如何评估

    一 项目上线质量指标 你认为用什么质量指标可以反映项目 上线的一个质量 你可能会想那不是有很多质量指标么 多数和BUG相关 例如BUG数量 重新打开BUG数 BUG解决时长等等 好像都能体现上线质量啊 可仔细想想 我们衡量上线质量 不能只看
  • 【ML】AdaBoost:实用介绍及如何使用 Python 进行分类和回归

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • sdio tf卡基础知识总结

    sdio介绍 SDIO的全称是安全数字输入 输出接口 一般都是用来SD卡 SD I O 卡 MMC卡进行通讯 SDIO总线拥有9根线 一个CLK时钟线 四条DATA双向数据线 一条双向指令线CMD VDD VSS1 VSS2电源和地信号线
  • GIT常用命令

    文章目录 前言 一 必备命令 rebase 变基 merge branch reset revert 二 将本地项目推送到远程 总结 问题 references 前言 当前工作区 add gt stage commit gt 本地仓库 pu
  • [SDOI2007]游戏【哈希+DAG拓扑】

    题目链接 先通过哈希确定点 这里我使用的是双值哈希 然后利用哈希判断可以和前面的出现的点如何链接 之后构造出来的图一定是一副DAG图 有向无环图 所以直接拓扑排序DP即可 include
  • 图解通信原理与案例分析-29:埃隆.马斯克的“星链”Starlink计划是卫星语音通信向卫星互联网的演进

    埃隆 马斯克一个值得技术人员尊敬的科技狂人 他把现实 科幻 理想 情怀 未来有机的融合在了一起 他有很多伟大的 革命性的构想与实现 星链 Starlink计划就是其中之一 本文就从通信的角度解读一下这个看似不可思议的计划 目录 第1章 什么
  • 618京东预售一般便宜多少?跟直接买有啥区别?

    618京东预售一般便宜多少 跟直接买有啥区别 京东作为消费者比较喜欢的电商购物平台之一 经常会推出促销打折的活动 以吸引用户到平台上购物 在这些大促活动中 平台会在预售环节设置专属的优惠 让消费者下单提前锁定这些折扣 一般这种情况能便宜多少
  • Vue模板语法:插值语法和指令语法

    div h1 插值语法 h1 h3 你好 name h3 hr h1 指令语法 h1 a 点我去 school name a a 点我去百度 a div
  • Array.prototype.slice.call()方法详解

    slice 用来截取截取字符串方法 Array javascript的一个引用类型 其原型prototype上有一个方法叫slice call和apply 用来改变对象中函数内部的this引用 使得函数可以随便换 妈妈 为什么不直接用 ar